每日一题 leetcode 移动零的问题

157 阅读2分钟

两种方法解决移动零的问题 蠢方法和好方法

题目描述

给定一个数组 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

题目分析

给了我们一个数组,需要我们把所有的零全部移到后面去,且不能复制数组,也就是得在原数组进行增删改查,或者用下标指针进行位置得调换。

蠢解法(当然是自己得解法啦)

先把含零得元素删了,再在后面添零,也就是对数组进行增删改查。

  • 删 删怎么删呢?我们可以用数组自带得splice方法 splice()后面有两个参数,删除位置和删除个数。但是splice有个特性,会改变元素组得长度,所以你散掉一个零后数组长度就减小了,你的i--,不然就不是遍历后一个数了,而是后后一个数。
  • 添 添的话就可以用push()方法,它是在数组末尾添加一个数,也是会修改原数组和改数组长度的,所以在删的时候加一个标记,删几个添加几个零。

上代码

var moveZeroes = function(nums) {
    let len=nums.length
    let tag=0
    for(i=0;i<len;i++)
    {
        if(nums[i]===0){
             nums.splice(i,1)
            tag++
            i--
        }
    }
 }

好方法(用下标去交换位置)双指针 这里就引用leetcode网友的解法啦

var moveZeroes = function(nums) {
    let slowIndex = 0;
    for (let fastIndex = 0; fastIndex < nums.length; fastIndex++) {
        if (nums[fastIndex] !== 0) {
            [nums[slowIndex], nums[fastIndex]] = [nums[fastIndex], nums[slowIndex]];
            slowIndex++;
        }
    }
};

设置两个指针,一个快一个慢,当数组没零的时候,两个指针是同步的,但是当有零存在,快指针就比慢指针快,从而交换位置,用一个for可以完成两个for的效果。看到这么优秀的解法,忍不住拿来用啦。 作者:zoking 链接:leetcode.cn/problems/mo… 来源:力扣(LeetCode) 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。