【Swift】LeetCode 283. 移动零
283. 移动零
题目描述
思路 and Swift 题解
这道题是经典的双指针问题,开始时需要在数组的起点声明两个指针,分别是slow
和fast
,之后fast
一直向后遍历整个数组,如果遇到nums[fast] != 0
,则执行slow
和fast
位置的元素的交换,同时slow
后移一个位置。这就保证了,如果数组在开始时都不为0
,那么slow
和fast
一起向后移动(交换相同位置等于没有交换),直到遇到nums[fast]
为0
,此时slow
不再移动,指向0
所在的这个位置,而fast
继续后移,找到下一个不为零的元素,将其与slow
位置的0
进行交换。
思路很明确,我们如何用 Swift 解决这个问题呢?此处涉及到两个关键点,第一点是在 Swift 当中如何获取Collection
类型的长度(数组Array
就是一个Collection
类型,Collection
又进一步遵循Sequence
协议);第二点是在 Swift 当中如何使用内置方法交换Array
当中两个数值的位置。
首先,对于Collection
类型,可以使用内置的count
属性来获取其中存储了多少个元素。
其次,Swift 的Array
内置了swapAt(_:, _:)
这个方法,它的参数是两个元素的下标,用于交换指定 Index 位置的元素。另一个可以用于交换Array
当中两个位置的元素的方法是swap(_:, _:)
,但它的用法比较复杂,并且安全性不如swapAt(_:, _:)
(不能交换两个相同位置的元素,否则会报错),因此解题时我使用swapAt(_:, _:)
来完成。
完整的 Swift 题解是:
class Solution {func moveZeroes(_ nums: inout [Int]) {var slow = 0, fast = 0while fast != nums.count {if nums[fast] != 0 {nums.swapAt(slow, fast)slow += 1}fast += 1}}
}