004 --- 移动零 ---力扣热题100题

文章讲述了如何使用双指针技巧解决一个编程问题,即在保持非零数原顺序的前提下,将数组中的所有0移动到末尾。作者通过实例代码解释了遍历过程和指针操作的关键步骤。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

起初,刚开始看到这个题,第一想法就是一个遍历把0过滤掉就行了,
但是我们尊重原题的意愿,我们用双指针!!!

他是说要非零数按原来的顺序排着,所以只能一步一步从左边开始
我们用两个指针a,b 用a来往前走,去找非0,一旦找到非0,就和b下标的数互换
此时b下标就是非0 而a下标是0,此时就需要一起往前进一了 不然就陷入死循环

刚开始,我回想,起始状态会不会有什么影响,但是确实是多虑了
你看 假如刚开始是0 按情况来 a是0 而不是非0 所以就往下找,然后当找到第一个非零,
就能交换,不会有任何影响,而且是由于从左往右的,所以顺序也不会变

var moveZeroes = function(nums) {
    let a=0,b=0; // 定义两个指针
    while(a!==nums.length){    
        if(nums[a] !== 0){     //用a去找非0
            nums[b] = nums[a]; // 找到了就互换
            if(a !== b)        // 但是有个细节,a不能与b相等  注意!!!
            nums[a] = 0        // 这里是交换 因为在a和b之间 已经确定都是0所以直接赋值0
            a++;               // 操作完后,就一起向前挪到一格
            b++;               //
        }else{
            a++                //如果没有找到 a就继续往下移动寻找
        }
    }
    return nums

};

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值