【LeetCode刷题】NO.18

105 阅读1分钟

Offer 驾到,掘友接招!我正在参与2022春招打卡活动,点击查看活动详情

一.题目

283. 移动零 给定一个数组 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

二、思路分析:

看题目,又是对数组的元素进行相关的操作,能够想到什么思路?答案是双指针,但是这道题与普通的双指针题目不同,因为这道题是要在不复制数组的情况下原地对数组进行操作,所以我们不能够创建额外的空间对数组元素进行操作,所以我们需要知道怎么在不创建额外空间的情况下能够把0全部移动到数组的末尾。

本题的最终思路就是:先利用双指针将数组中的0全部去掉,然后将慢指针以及之后的索引代表的数值全部设为0即可完成要求。

三、代码:

/**
 * @param {number[]} nums
 * @return {void} Do not return anything, modify nums in-place instead.
 */
var moveZeroes = function(nums) {
    if(nums.length == 1) return nums
    //还是利用双指针
    let slow = 0,fast = 0
    while(fast<nums.length){
        if(nums[fast] !== 0){
            //不等于0对slow进行操作
            nums[slow] = nums[fast]
            slow++
        }
        fast++
    }
    for(let i=slow ; i<nums.length ; i++){
        nums[i] = 0
    }
    return nums
};

四、总结:

这种原地更改数组的题目通常都是使用双指针的套路,当然除了双指针的套路还有很多的思路去求解问题,当我发现我的算法时间复杂度比较高的时候看到了别人利用sort函数一行代码也是可以解决这道题的,别人仅用一行代码nums.sort((a,b) => b? 1: -1)就能够完成操作就很值得我们学习,这是熟练掌握了JS的成果0.0