关于leetcode:力扣之移动零

26次阅读

共计 1157 个字符,预计需要花费 3 分钟才能阅读完成。

题目形容

给定一个数组 nums,编写一个函数将所有 0 挪动到数组的开端,同时放弃非零元素的绝对程序。

请留神,必须在不复制数组的状况下原地对数组进行操作。

示例 1:

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

示例 2:

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

力扣原题目地址:https://leetcode.cn/problems/…

思路剖析

解法一 遍历统计 0 呈现了几次并删除之,最初依据 0 呈现的次数往尾部追加 0

var moveZeroes = function (nums) {
    let count = 0 // 1. 定义一个变量,用来统计 0 呈现的次数
    for (let i = 0; i < nums.length; i++) { // 2. 遍历这个数组,看看 0 呈现了几次
        if (nums[i] == 0) { // 3. 如果遇到的不是 0,不做任何操作;如果遇到 0 了,就把 0 删掉
            nums.splice(i, 1) // 4. 把遇到的这一项(0)给删除掉
            i-- // 5. 留神 数组塌陷,索引对立往前平移一位
            count = count + 1 // 6. 而后统计一下 0 呈现的次数
        }
    }
    for (let i = 0; i < count; i++) { // 7. 依据 0 呈现的次数,决定往数组的尾部追加几个 0
        nums.push(0) // 8. 呈现了几个 0,最初就追加几个 0,
    }
};

这种形式,须要遍历两次,咱们遍历一次也是能够解决的,思路略有类似。如下代码

解法二 尾部追加一个完结项标识,遍历遇到 0 删除之

 var moveZeroes = function (nums) {nums.push('endFlag') // 1. 手动在数组的最初,追加一项,用于判断是否遍历到最初的标识
    for (let i = 0; i < nums.length; i++) { // 2. 遍历这个数组
        // 3. 一开始必定不是最初一项的标识,所以持续往后看
        if (nums[i] == 'endFlag') { // 8. 当遇到之前咱们手动增加的 'endFlag' 标识的时候,就阐明原来的数组遍历一遍了
            nums.splice(i, 1) // 9. 最初再把之前手动增加的标识给删掉就行啦,搞定
            return
        }
        if (nums[i] === 0) { // 4. 当遇到 0 的时候做挪动零操作
            nums[nums.length] = 0 // 5. 先再数组的最初的地位增加一个 0
            nums.splice(i, 1) // 6. 而后在把以后的 0 删除掉,这样也能够了解为挪动 0
            i-- // 7. 留神数组删除掉一个元素当前,数组的索引塌陷,后续的索引都会往后退一位,所以须要再对立扣除 1 位,以达到均衡
        }
    }
};

总结

在理论工作中,工夫复杂度,要优先与空间复杂度,因为空间复杂度问题,多减少点内存就行了。然而工夫复杂度,才是咱们写代码谋求的极速指标。所以,能遍历一次的,最好不要遍历两次。至于多定义几个变量导致多用了一些内存,基本上能够疏忽的

正文完
 0