JAVA_双指针练习_复写零

题目:

解析:

        我们先创建两个指针变量,一个cur指针指向数组的序列为0的位置,一个dest指针指向数组序列为-1的位置,先从前往后遍历一遍,找到边界值cur,然后再重后往前遍历复写0。

        边界值cur的查找:在遍历的时候当arr[cur]非零数字时,dest就向前进一步,如果遇到零数字时就向前两步,这一步走完后我们要先判断dest是否越界,如果走到数组的最后一位时,就退出该循环,这时候cur指向的就是边界值。

        从后往前遍历复写0:这个时候我们的dest为最后一个值,cur为边界值,然后就往前遍历。如果arr[cur]为非零数字时,dest就与cur位置的值交换,同时进行-1的操作,如果为零数字时,dest和dest-1的位置就为0,并再进行一次-1的操作。

        特殊情况:当数组长度-2位置的值为0,dest就会越界,这个时候我们就需要判断dest是否=n,如果是就将cur[n-1]赋值为0,cur向前一步,dest向前两步。

代码:

class Solution {
    public void duplicateZeros(int[] arr) {
        int cur=0,dest=-1,n=arr.length;
        while(dest<n){
            if(arr[cur]!=0){
                dest++;
            }else{
                dest+=2;
            }
            if(dest>=n-1){
                break;
            }
            cur++;
        }

        if(dest>=n){
            dest-=2;
            cur--;
            arr[n-1]=0;
        }

        while(cur>=0){
            if(arr[cur]!=0){
                arr[dest--]=arr[cur--];
            }else{
                arr[dest--]=0;
                arr[dest--]=0;
                cur--;
            }
        }

    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值