LeetCode——1089.复写零

通过万岁!!!

  • 题目:就是给你一个数组,然后遇到0以后就将后面的元素右移一个,然后这个0后面的位置再补一个0。因为复写了,所以后面肯定会有元素直接移除去了,那就删掉就行了,并且不能在申请空间。
  • 思路:这个题首先你要确定我们那些数是有用的,也就是说我们要找到一个位置idx,然后从0到idx这些内容将0复写以后就能填满整个数组,后面的元素我们不要了。然后找到了以后,就用双指针从后面开始填写即可。如果左指针不是0,则右指针位置等于左指针位置,并且两个指针都–;如果左指针是0,则右指针–以后在设置为0以后再–。这里有个地方需要注意,就是你找idx的时候,有可能他是一次性+2,这时候进行数组赋值的时候需要单独判断一下。
  • 技巧:双指针

java代码

class Solution {
    public void duplicateZeros(int[] arr) {
        // 多余的部分就扔掉了
        // 首先要找到,我们到什么位置就可以停止
        int len = arr.length;
        int idx = 0;
        int l = -1;// 到哪个位置就可以结束了,剩下的我们就都会删除掉
        while (idx < len) {
            l++;
            if (arr[l] != 0) {
                idx++;
            } else {
                idx += 2;
            }
        }
        //从l到0进行遍历这个数组,然后填充到r的位置
        int r = len - 1;// 指向数组的最后
        if (idx == len + 1) {// idx越界,这是因为l最后一次是0,然后一次性加了2,这时候我们只需要保证最后一个是0即可
            arr[r] = 0;
            l--;
            r--;
        }
        while (r >= 0) {
            arr[r] = arr[l];
            r--;
            if (arr[l] == 0) {
                arr[r] = 0;
                r--;
            }
            l--;
        }
    }
}
  • 总结:题目挺不是特别难,就是,但是思路可能比较难想一点。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值