leetcode|283 移动零

66 阅读1分钟

要求将数组中的零全部移动到最右边,并保证非零元素的相对位置不变【题目地址】

示例 1:

输入: nums = [0,1,0,3,12]
输出: [1,3,12,0,0]

示例 2:

输入: nums = [0]
输出: [0]

示例 3:

输入: nums = [1,0,1]
输出: [1,1,0]

思路分析:

  1. 利用双指针(快慢指针),快指针遍历数组,慢指针记录下一个非零元素应该放置的位置
  2. 使用fast指针从头到位遍历数组。
  3. 如果nums[fast]是非零元素,则将nums[slow]与nums[fast]交换。

code1:

    let slow = 0, fast =0;
    while(fast < nums.length){
        if(nums[fast] !== 0){
            [nums[slow],nums[fast]] = [nums[fast],nums[slow]]
            slow++
        }
        fast ++
    }
}

也可以巧用sort方法

code2:

var moveZeroes = function (nums) {
  nums.sort((a, b) => {
    // 如果两个元素都是 非0 或者都是 0,保持相对位置不变,减小操作次数
    if ((a && b) || (a===0 && b===0)) return 0
    // 如果前面是 0 后面是 非0,返回 1,保证 非0 在前,0 在后
    if (a===0 && b) return 1
    // 如果前面是 非0 后面是 0,返回 -1,保证 非0 在前,0 在后
    return -1
  })
}