【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 个元素
    }
}
相关推荐
szp20058 小时前
中文字幕烧进视频后整片空白:CoreText 低报行高,导出照样成功
ios·swift
2501_9151063216 小时前
iOS 单元测试怎么跑?用 KXApp 在 VS Code 里跑 XCTest 和 Swift Testing
ide·vscode·ios·单元测试·个人开发·swift·敏捷流程
东坡肘子17 小时前
当应用不再属于特定操作系统 -- 肘子的 Swift 周报 #159
人工智能·swiftui·swift
2501_915106324 天前
Windows 用 KXBuild 开发 iOS 项目,CocoaPods、SPM 怎么处理?
windows·vscode·ios·个人开发·swift·敏捷流程·cocoapods
2501_916008895 天前
Windows 上写第一个 SwiftUI App,KXBuild 空工程起步,跑到 iPhone 真机
ide·vscode·ios·objective-c·个人开发·swift·敏捷流程
songgeb5 天前
iOS App支持设置RTL语言的实践
ios·swift·ui kit
2501_915106327 天前
KXApp 的 VS Code 真机调试:按下 Cmd+R 之后发生了什么
ide·vscode·ios·objective-c·个人开发·swift·敏捷流程
2601_955518187 天前
36. 跨语言:C/C++与Swift&Objective-C混合编程(一)
objective-c·swift·c/c++·混合编程·跨语言
东坡肘子8 天前
谁是 AI-relay App 的真正威胁 -- 肘子的 Swift 周报 #158
人工智能·swiftui·swift
叫Guava不是瓜娃8 天前
我用 Swift 写了个本地语音输入:按住说话,松开就是整理好的文字(开源)
swift