复写零——双指针算法

题目链接

复写零icon-default.png?t=O83Ahttps://leetcode.cn/problems/duplicate-zeros/description/

题目要求

样例

题目分析

     先看示例1,题目要求将数组中所有的0,均复写一遍,且要在原数组上进行更改,多余的元素消失

 

    但我们发现,如果双指针从后往前遍历,即 

    cur 初始指向最后一个复写的数,按上述方法,进行从后往前复写,显然是可以的,所以我们首先要找出最后一个复写的数,再进行遍历即可

算法思路 

        如果「从前向后」进行原地复写操作的话,由于 0 的出现会复写两次,导致没有复写的数「被覆盖掉」。因此我们选择「从后往前」的复写策略。

        但是「从后向前」复写的时候,我们需要找到「最后⼀个复写的数」,因此我们的⼤体流程分两 步:

                i. 先找到最后⼀个复写的数

                ii. 然后从后向前进行复写操作 ;

个人复写思路 

    1、找到最后复写的数 

        (1)定义两个指针如下图,判断cur的值处是否为 0 ?

                为 0dest 后移两步

                不为 0:dest 后移一步

        (2)判断 dest 是否指向数组最后一个元素位置 ,如果是,则停止,不是 cur 后移一步

        (3) 最后 cur 指向即最后复写元素

    2,判断 dest 是否越界

此情况下,dest 会越界,此时我们需要将数组最后位置设置为 0 ,dest 前移2步,cur 前移1步即可,如图:

     3、从后向前进行复写操作

解题代码

class Solution {
    public void duplicateZeros(int[] arr) {
        int cur=0,dest=-1;
        while(cur<arr.length){
            if(arr[cur]==0){
                dest+=2;
            }else{
                dest++;
            }
            if(dest>=arr.le-1){
                break;
            }
            cur++;
        }
        if(dest==arr.length){
            arr[arr.length-1]=0;
            dest-=2;
            cur--;
        }
        while(cur>=0){
            if(arr[cur]==0){
                arr[dest--]=0;
                arr[dest--]=0;
            }else{
                arr[dest--]=arr[cur];
            }
            cur--;
        }
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值