题目描述
分析
使用双指针不断交换位置,左指针 l,右指针 r
n 为数组长度
循环不变量:[0, l] 为非零区间,[r, n - 1] 均为 0
算法
double pointers
过程
循环推出条件:r 到达边界
只要当前 r 不为零,就将 l 与 r 位置的值进行交换,交换后 l++
不论交换不交换,在 while 循环体内部最后,都要执行 r++
代码
/**
* @param {number[]} nums
* @return {void} Do not return anything, modify nums in-place instead.
*/
var moveZeroes = function(nums) {
const n = nums.length
let l = 0, r = 0
while (r < n) {
while (nums[r]) {
[nums[r], nums[l]] = [nums[l], nums[r]]
l++
r++
}
r++
}
return nums
};