Move Zeroes

134 阅读1分钟

题目描述

leetcode-cn.com/problems/mo…

分析

使用双指针不断交换位置,左指针 l,右指针 r

n 为数组长度

循环不变量:[0, l] 为非零区间,[r, n - 1] 均为 0

算法

double pointers

过程

循环推出条件:r 到达边界

只要当前 r 不为零,就将 lr 位置的值进行交换,交换后 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
};