算法刷题:复写零

.

在这里插入图片描述

习题链接

复写零

题目描述

给你一个长度固定的整数数组 arr ,请你将该数组中出现的每个零都复写一遍,并将其余的元素向右平移。

注意:请不要在超过该数组长度的位置写入元素。请对输入的数组 就地 进行上述修改,不要从函数返回任何东西。

输入:arr = [1,0,2,3,0,4,5,0]
输出:[1,0,0,2,3,0,0,4]
解释:调用函数后,输入的数组将被修改为:[1,0,0,2,3,0,0,4]

算法原理

这道题用到的算法是双指针算法,我们定义两个指针:cur和dest,这两个指针需要帮助我们完成两件事:

  1. 找到最后一个复写的数
  2. 从后往前进行复写操作

初始值

cur的初始值为0,因为它需要从零开始遍历数组中的数
dest的初始值为-1,因为它表示复写后的最后一位数的地址

步骤1

步骤1是利用双指针中的快慢指针来完成:

  1. 判断当前cur的值是否为0
  2. 如果cur为零,dest就往后走两步,不为零则走一步
  3. 判断当前dest是否已经走到数组的末尾,如果没有,则执行下一步
  4. cur++

步骤2

  1. 判断dest是否已经越界,如果已经越界,执行下面步骤
    a. 将n-1的位置修改为0
    b. cur向前倒退一步,即cur–;dest倒退两步
  2. 从cur位置开始遍历数组,依次进行复写操作
  3. 判断cur当前的值:
    a. 如果是0,dest以及dest-1的位置修改为0,然后dest-=2;
    b. 如果非0,dest位置修改为cur位置的值,dest-=1;
    c.cur–,然后复写下一个数

我的答案:

class Solution {
    public void duplicateZeros(int[] arr) {
        int cur = 0;
        int dest = -1;
        int n = arr.length;
        //1.找到复写的最后一个数
        for(;dest<=n-1;cur++){
            if(arr[cur]==0){
                dest+=2;
            }else{
                dest++;
            }
            if(dest>=n-1) break;
        }
        //2.从后往前进行复写
        //a.处理特殊情况
        if(dest>n-1){
            arr[n-1]=0;
            cur--;
            dest-=2;
        }
        while(cur>=0){
            if(arr[cur]==0){
                arr[dest--]=0;
                arr[dest--]=0;
            }else{
                arr[dest--]=arr[cur];
            }
            cur--;
        }
    }
}
  • 10
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值