Skip to content

283. 移动零

js
;(function () {
  /**
   * 283. 移动零
   * 给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序。
   * 请注意 ,必须在不复制数组的情况下原地对数组进行操作。
   *
   * 输入: nums = [0,1,0,3,12]
   * 输出: [1,3,12,0,0]
   *
   * 输入: nums = [0]
   * 输出: [0]
   *
   * 进阶:你能尽量减少完成的操作次数吗?
   *
   */

  function moveZeroes(nums: number[]): void {
    // 方法一:双指针
    // if (!nums) {
    //     return
    // }
    // let len: number = nums.length;
    // let p1: number = 0;
    // // 1. 非0的数全部提前
    // for(let i = 0; i < len; i++) {
    //     if (nums[i] !== 0) {
    //         nums[p1++] = nums[i];
    //     }
    // }
    // // 2. 下标p1后的数全部设置为0
    // for (let i = p1; i < len; i++) {
    //     nums[i] = 0
    // }

    // 方法二: 双指针
    // if (!nums) {
    //     return
    // }
    // const len: number = nums.length;
    // let left: number = 0, right: number = 0;
    // for (let i = 0; i < len; i++) {
    //     if (nums[right] !== 0) {
    //         let temp = nums[right]
    //         nums[right] = 0;
    //         nums[left] = temp;
    //         left++
    //     }
    //     right++
    // }

    // 方法三: 一次遍历
    if (!nums) {
      return
    }
    let j = 0
    for (let i = 0; i < nums.length; i++) {
      if (nums[i] !== 0) {
        let temp = nums[i]
        nums[i] = nums[j]
        nums[j++] = temp
      }
    }
  }

  // let nums = [0, 1, 0, 3, 12]
  let nums = [0, 0, 1]
  moveZeroes(nums)
  console.log(nums)
})()