283. 移动零

给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序。

示例:

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

说明:

必须在原数组上操作,不能拷贝额外的数组。

尽量减少操作次数。

解法

1、双指针(2021.11.11 自己的解法)

/**
 * @param {number[]} nums
 * @return {void} Do not return anything, modify nums in-place instead.
 */
var moveZeroes = function (nums) {
  let i = 0;
  let j = 1;

  while (i < nums.length && j < nums.length) {
    if (nums[i] === 0 && nums[j] !== 0) {
      const temp = nums[i];
      nums[i] = nums[j];
      nums[j] = temp;
      i++;
      j++;
    } else if (nums[i] === 0 && nums[j] === 0) {
      j++;
    } else {
      i++;
      j++;
    }
  }

  return nums;
};

// 执行用时:100 ms, 在所有 JavaScript 提交中击败了35.22%的用户
// 内存消耗:42.7 MB, 在所有 JavaScript 提交中击败了8.63%的用户
// 通过测试用例:74 / 74

2、把非 0 的往前挪

把非 0 的往前挪,挪完之后,后面的就都是 0 了,然后在用 0 覆盖后面的

/**
 * @param {number[]} nums
 * @return {void} Do not return anything, modify nums in-place instead.
 */
var moveZeroes = function (nums) {
  if (nums == null || nums.length == 0) {
    return;
  }
  let index = 0;
  for (let i = 0; i < nums.length; i++) {
    if (nums[i] !== 0) {
      nums[index] = nums[i];
      index++;
    }
  }

  while (index < nums.length) {
    nums[index] = 0;
    index++;
  }
  return nums;
};

3、双指针法

/**
 * @param {number[]} nums
 * @return {void} Do not return anything, modify nums in-place instead.
 */
var moveZeroes = function (nums) {
  let i = 0;
  for (let j = 0; j < nums.length; j++) {
    //只要不为0就往前挪
    if (nums[j] != 0) {
      //i指向的值和j指向的值交换
      let temp = nums[i];
      nums[i] = nums[j];
      nums[j] = temp;

      i++;
    }
  }
};