leetCode 编号283

4 阅读1分钟

283. 移动零:给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序。 请注意 ,必须在不复制数组的情况下原地对数组进行操作

方法一:
思路:
  1. 从后往前遍历原数组,值等于 0 时,splice(i, 1) 原地删除,再通过 nums.push(0)0 加入到数组尾部,数组正常遍历就行,不需要额外操作 i
/**
 * @param {number[]} nums
 * @return {void} Do not return anything, modify nums in-place instead.
 */
var moveZeroes = function(nums) {
    let len = nums.length
    for(let i = len - 1; i >= 0; i--) {
        if(nums[i] === 0) {
            nums.splice(i, 1)
            nums.push(0)
        }
    }
};
方法二:
思路:
  1. 采用快慢指针的方式,当 j 指针不等于 0 时,替换指针 i 和指针 j 位置的值,最终会将所有不是0的值都按顺序赋值到前方,而 0 必定会被替换到后方
  2. 打个比方说数组里每个数字都是一个球,有两个篮子一个球名字叫 i ,另一个叫 j,当篮子 j 内的球上的数字 不等于 0 时,就和篮子 i 内的球替换,然后篮子 i 往后移动一个位置,当篮子 j 走完和所有球都比较完之后,篮子 i 左边的所有球上的数字都应该是 不等于 0 的,那剩下 等于 0 的球将都在篮子 i 的右边
/**
 * @param {number[]} nums
 * @return {void} Do not return anything, modify nums in-place instead.
 */
var moveZeroes = function(nums) {
    let len = nums.length
    let i = 0
    for(let j = 0; j < len; j++) {
        if(nums[j] !== 0) {
            // 解构赋值的形式 替换两个位置的位置的值
           [nums[i], nums[j]] = [nums[j], nums[i]]
           i++
        }
    }
};