「前端刷题」283.移动零(EASY)

68 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第23天,点击查看活动详情

题目(Move Zeroes)

链接:leetcode-cn.com/problems/mo… 解决数:5532 通过率:64% 标签:数组 双指针 相关公司:facebook amazon microsoft 给定一个数组 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,双指针交换

  • 指针 iijj 初始指向索引 0
  • 指针 jj 指向提供给非 0 项的坑位
  • 指针 ii 推进找非 0 项,想交换到 jj 指向的坑位
var moveZeroes = function (nums) {
    let i = 0, j = 0;
    while (i < nums.length) {
        if (nums[i] != 0) {
            [nums[i], nums[j]] = [nums[j], nums[i]];
            i++;
            j++;
        } else {
            i++;
        }
    }
};

思路2,非 0 项覆盖到数组前头

  • 将所有非 0 项覆盖到数组的前头,然后将剩下的位置覆盖为 0
  • 安排了所有非 0 项,剩下位置就属于 0
  • j 指向提供给非 0 项的坑位
var moveZeroes = function (nums) {
    let j = 0;
    for (let i = 0; i < nums.length; i++) {
        if (nums[i] != 0) { // 遇到非0项
            nums[j] = nums[i]; // 覆盖到j上
            j++;    // j后移
        }
    }
    for (let i = j; i < nums.length; i++) { // 剩下的位置赋为0
        nums[i] = 0;
    }
};

思路3

  • 利用快慢指针,快指针指向的元素如果不等于0的话,放把它放到前面来,也就是放到慢指针所指向的位置,慢指针向后移1位
  • 快指针走到数组末尾了,慢指针前面的都是不等于0的元素
  • 把慢指针后面的元素都置为0
/**
 * @param {number[]} nums
 * @return {void} Do not return anything, modify nums in-place instead.
 */
var moveZeroes = function (nums) {
  let fast = 0,
    slow = 0;
  while (fast < nums.length) {
    if (nums[fast] != 0) {
      nums[slow++] = nums[fast];
    }
    fast++;
  }
  while (slow < nums.length) {
    nums[slow++] = 0;
  }
};

思路4

  • 解题思路1在于只把快指针指向的不等于0的元素都移动到慢指针的位置来,其实我们可以进一步想
  • 快指针指向的不等于0的元素,把它跟慢指针指向的元素交换
  • 当快指针走到末尾的时候,其实已经全部交换完毕了,前面的都是不为0的元素,后面的都是0的元素了
/**
 * @param {number[]} nums
 * @return {void} Do not return anything, modify nums in-place instead.
 */
var moveZeroes = function (nums) {
  let fast = 0,
    slow = 0;
  while (fast < nums.length) {
    if (nums[fast] != 0) {
      [nums[fast], nums[slow]] = [nums[slow], nums[fast]];
      slow++;
    }
    fast++;
  }
};