[路飞] 移动零

89 阅读1分钟

记录 1 道算法题

移动零

leetcode-cn.com/problems/mo…


要求:给一个数组,将 0 移动到数组的最后,同时非 0 的数的相对位置不变,举个例子就是 1 在 3 前面的话,那么移动后 1 依然在 3 的前面。

比如:[0,1,0,3,12]。移动后:[1,3,12,0,0]

我们需要使用两个指针。第一个指针进行遍历。第二个指针永远指着右边最近的非 0 的下标。所以第二个指针会使用 while 循环。

思路就是当前的值如果是 0 就找下一个不是 0 的下标。用第二个指针指向它,并且进行数的交换。需要注意的一个地方就是如果第二个指针比第一个指针小,那么需要将第二个指针同步到第一个指针的下一个位置。

    function moveZeroes(nums) {
        let a = 0
        let b = 0
        for(let i = 0; i < nums.length; i++) {
            const n = nums[i]
            if (n === 0) {
                // 找最近的非 0 的下标
                while(nums[b] === 0) {
                    b++
                }
                // 进行位置交换, 当 b 是 nums.length 的时候,就是 0 了。
                nums[i] = nums[b] || 0
                // 这里要现在 b 必须在数组长度范围内,不然会扩大数组空间,导致第二个指针一直递增死循环。
                // 交换为 0
                b < length && (nums[b] = 0)
            } else {
                // 这里是非 0,需要判断一下第二个指针是否需要更新
                if (b <= i) b = i + 1
            }
        }
    }