「双指针」leetcode 283.移动零(简单)

415 阅读2分钟

这是我参与11月更文挑战的第13天,活动详情查看:2021最后一次更文挑战

一、了解题目

附上原题链接:283. 移动零

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

示例:

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

说明:

  • 必须在原数组上操作,不能拷贝额外的数组
  • 尽量减少操作次数。

二、题解分析

1、题意剖析

依据以上题意,首先我们想到的是用双指针的方式来进行求解。具体方式为:

  • 慢指针所指向的都是不等于 0 的元素,筛选出一个不等于 0 的元素就放到慢指针所指的位置,然后让慢指针前进一步;
  • 当快指针走到末尾的时候,所有数即全部交换完毕了。

2、题解步骤

依据以上所剖析的结果,我们来罗列出具体的解题步骤。如下所示:

  • 定义一个快指针和一个慢指针;
  • 建立一个循环,判断条件是快指针必须小于数组的长度;
  • 判断快指针当前所在位置的数字是否为0;
  • 如果不是 0 ,将快指针和慢指针的位置进行交换;
  • 如果是 0 ,则将快指针进行 +1 操作;
  • 最终返回结果。

三、代码实现

依据上面的题解,我们将用 js 来实现这道题。具体实现代码如下:

/**
 * @description leetcode 283.移动零
 *//**
 * @param {number[]} nums
 * @return {void} Do not return anything, modify nums in-place instead.
 */
var moveZeroes = function (nums) {
    // 1.定义一个快指针和一个慢指针
    let fast = 0,
        slow = 0;
    // 2.判断条件:快指针必须小于数组的长度
    while (fast < nums.length) {
        // 2.1 判断快指针当前所在位置的数字是否为0
        if (nums[fast] !== 0) {
            // 2.1.1 将快指针和慢指针的位置进行交换
            [nums[fast], nums[slow]] = [nums[slow], nums[fast]];
            slow++;
        }
        // 2.2 当快指针所在位置的数字为0时,那么将快指针进行+1操作
        fast++;
    }
    // 3.返回结果
    return nums;
};
​
console.log(moveZeroes([0,1,0,3,12])); // [ 1, 3, 12, 0, 0 ]

思路来源:移动零

以上就是关于移动零的题解,不知道对小伙伴们是否有帮助呢?

我们下期见👋👋👋