记录 1 道算法题
移动零
要求:给一个数组,将 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
}
}
}