力扣之移动零

陶宗旺
• 阅读 1340

题目描述

给定一个数组 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位,以达到平衡
        }
    }
};

总结

在实际工作中,时间复杂度,要优先与空间复杂度,因为空间复杂度问题,多增加点内存就行了。但是时间复杂度,才是我们写代码追求的极速目标。所以,能遍历一次的,最好不要遍历两次。至于多定义几个变量导致多用了一些内存,基本上可以忽略的

点赞
收藏
评论区
推荐文章
Wesley13 Wesley13
3年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
美凌格栋栋酱 美凌格栋栋酱
7个月前
Oracle 分组与拼接字符串同时使用
SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(
孤心独饮 孤心独饮
4年前
从零开始刷力扣(一)——485:最大连续1的个数
分类:数组的遍历题目描述:给定一个二进制数组,计算其中最大连续1的个数。示例1:输入:1,1,0,1,1,1输出:3解释:开头的两位和最后的三位都是连续1,所以最大连续1的个数是3.思路初始化count和maxCount,然后遍历数组,遇见1则count,并且更新与maxCount比较,若比maxCount更大,则更新m
先知 先知
4年前
C 语言代码大全
1两个数组的合并题目描述已知数组a中有m个按升序排列的元素,数组b中有n个按降序排列的元素,编程将a与b中的所有元素按降序存入数组c中。输入输入有两行,第一行首先是一个正整数m,然后是m个整数;第二行首先是一个正整数n,然后是n个整数,m,n均小于等于1000000。输出输出合并后的mn个整数,数据之间用空格隔开。输出占一行。样例输入4
Wesley13 Wesley13
3年前
Java开发者容易犯的十个错误
!(https://oscimg.oschina.net/oscnet/c9f00cc918684fbe8a865119d104090b.gif)Top1.数组转换为数组列表将数组转换为数组列表,开发者经常会这样做:\java\List<StringlistArrays.asList(arr);Arr
Stella981 Stella981
3年前
LeetCode 5561. 获取生成数组中的最大值
文章目录1\.题目2\.解题1\.题目给你一个整数n。按下述规则生成一个长度为n1的数组nums:nums00nums11当2<2i<n时,nums2inumsi
Wesley13 Wesley13
3年前
ES6 新增的数组的方法
给定一个数组letlist\//wu:武力zhi:智力{id:1,name:'张飞',wu:97,zhi:10},{id:2,name:'诸葛亮',wu:55,zhi:99},{id:3,name:'赵云',wu:97,zhi:66},{id:4,na
Stella981 Stella981
3年前
LeetCode:283.移动零——简单
题目:283.移动零:给定一个数组nums,编写一个函数将所有0移动到数组的末尾,同时保持非零元素的相对顺序。示例:输入:0,1,0,3,12输出:1,3,12,0,0说明:1.必须在原数组上操作,不能拷贝额外的数组。2.尽量减少操作
Stella981 Stella981
3年前
Leetcode724:寻找数组的中心索引(java、python3)
寻找数组的中心索引给定一个整数类型的数组nums,请编写一个能够返回数组\\“中心索引”\\的方法。我们是这样定义数组中心索引的:数组中心索引的左侧所有元素相加的和等于右侧所有元素相加的和。如果数组不存在中心索引,那么我们应该返回1。如果数组有多个中心索引,那么我们应该返回最靠近左边的那一个。
深度学习 深度学习
1个月前
LeetCode 2576题解:双指针法求解最多标记下标(排序+贪心策略)
一、题目解读2576题要求在一个整数中寻找最多可标记的下标对:若nums法”的组合思路:1.排序预处理:对原数组nums进行升序排序,确保相同元素聚集,便于后续配对。2.双划分:将排序后的数组分为左右两半(左指针left0,右指针rightn/2),从
贾蔷 贾蔷
1星期前
力扣面试题10.01:利用双指针法原地合并有序数组
一、题目解读10.01要求将两个有序A和B合并成一个有序数组,且合并结果需存储在数组A中(原地修改)。需确保合并后的A元素按升序排列,同时考虑A末尾可能存在无效元素(填充0)。核心挑战在于如何在O(mn)时间复杂度内完成合并,避免使用额外空间。二、解题思