283. 移动零

74 阅读1分钟

题目

🔗题目链接:283. 移动零 - 力扣(LeetCode)

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

请注意 ,必须在不复制数组的情况下原地对数组进行操作。

示例 1:

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

示例 2:

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

提示:

  • 1 <= nums.length <= 104
  • -231 <= nums[i] <= 231 - 1

进阶: 你能尽量减少完成的操作次数吗?

思路

双指针

  1. 快慢指针遍历。将数组内非0的元素移动到数组前面,然后从slow的位置向后走,同时把每一项都赋值为0.
  2. 快慢指针遍历。将fast指针指到的非0元素与slow指针指到0元素交换,因为数组是已经排过序的,所以在从前往后的遍历过程中可以放心大胆地交换元素。

代码

思路一

function moveZeroes(nums: number[]): void {
  const lens = nums.length;
  let slow = 0;
  let fast = 0;

  while (fast < lens) {
    if (0 === nums[fast]) {
      fast++;
    } else {
      nums[slow] = nums[fast];
      slow++;
      fast++;
    }
  }

  while (slow < lens) {
    nums[slow] = 0;
    slow++;
  }
}

思路二(这个只需要进行一次遍历,进行的操作更少)

function moveZeroes(nums: number[]): void {
  const lens = nums.length;
  let slow = 0;
  let fast = 0;

  while (fast < lens) {
    if (0 === nums[fast]) {
      fast++;
    } else {
      [nums[slow], nums[fast]] = [nums[fast], nums[slow]];
      slow++;
      fast++;
    }
  }
}