283. 移动零

在这里插入图片描述

题目描述

请添加图片描述

思路 and Swift 题解

这道题是经典的双指针问题,开始时需要在数组的起点声明两个指针,分别是slowfast,之后fast一直向后遍历整个数组,如果遇到nums[fast] != 0,则执行slowfast位置的元素的交换,同时slow后移一个位置。这就保证了,如果数组在开始时都不为0,那么slowfast一起向后移动(交换相同位置等于没有交换),直到遇到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 = 0
        while fast != nums.count {
            if nums[fast] != 0 {
                nums.swapAt(slow, fast)
                slow += 1
            }
            fast += 1
        }
    }
}
Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐