【Swift】LeetCode 189. 轮转数组

189. 轮转数组

题目描述

思路与 Swift 题解

解决这道题目的思路其实就是首先对整个数组进行翻转,然后翻转[0, k -1][k, n - 1]这个区间上的元素。注意,k要对数组的长度先原地求余。

因此,问题简化为,在 Swift 当中,如何对一个数组进行翻转。

Swift 当中并没有提供像 C++ 那种基于迭代器的区间式翻转,库函数提供了两种方法,分别是reverse()reversed(),前者直接原地翻转,而后者返回翻转后的新数组。

看起来,Swift 的库函数并不能解决我们"按照区间"翻转的需求,但我们可以自己封装一个原地进行区间翻转的函数。我们定义一个新函数,它接受一个inout的数组,以及一个左闭右开的区间Range<Int>(完全闭区间的类型是ClosedRange<Int>,注意开区间和闭区间在 Swift 当中是不同的类型)。在这个函数当中,我们首先对区间指定的子数组进行一次翻转,之后再使用翻转后的区间替换原来数组当中相应的区间(可以使用库函数提供的replaceSubrange方法来完成原地替换)。

我们封装的函数定义为:

swift 复制代码
func reverseSubrange(_ nums: inout [Int], _ range: Range<Int>) {
		let reversedSubrange = Array(nums[range].reversed())	// 注意, 使用 reversed() 方法, 它将返回翻转后的数组.
		nums.replaceSubrange(range, with: reversedSubrange)
		// replaceSubrange 方法的签名就是 replaceSubrange(_:with:)
}

基于这个函数,我们可以实现我们刚才提到的思路并解决这道题,完整的 Swift 题解是:

swift 复制代码
class Solution {
    func reverseSubrange(_ nums: inout [Int], _ range: Range<Int>) {
		let reversedSubrange = Array(nums[range].reversed())
		nums.replaceSubrange(range, with: reversedSubrange)
        // replaceSubrange 方法的签名就是 replaceSubrange(_:with:)
    }

    func rotate(_ nums: inout [Int], _ k: Int) {
        var k = k % nums.count
        nums.reverse()                          // 对数组进行原地翻转
        reverseSubrange(&nums, 0..<k)           // 翻转前 k 个元素
        reverseSubrange(&nums, k..<nums.count)  // 翻转后 k 个元素
    }
}
相关推荐
sweet丶5 小时前
Swift 元编程-Macro
swift
影寂ldy3 天前
WinForm PictureBox控件 + ImageList组件 完整笔记
开发语言·笔记·swift
Deepzz4 天前
macOS 上调教第三方鼠标的一些经验:从滚动顺滑到输入法自动切换
macos·swift·鼠标
东坡肘子5 天前
WWDC 26:AI 帮你看完了,然后呢?-- 肘子的 Swift 周报 #140
人工智能·swiftui·swift
大熊猫侯佩5 天前
SwiftData 迁移深度指南:从入门到“填坑”(下集)
数据库·swift·编程语言
大熊猫侯佩5 天前
SwiftData 迁移深度指南:从入门到“填坑”(上集)
数据库·swift·编程语言
多彩电脑6 天前
SwiftUI的导航界面的嵌套问题
开发语言·swift·设计语言
wjm0410066 天前
ios内存管理
ios·objective-c·swift·客户端开发
大熊猫侯佩7 天前
Swift 6.4 的 Ref / MutableRef 大揭秘:给值类型开一扇“安全的小窗”
ios·swift·编程语言
大熊猫侯佩7 天前
WWDC26 SwiftUI 进化之路:砸碎黑盒,彻底迎来开发自由!
ios·swiftui·swift