栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

LeetCode——1089.复写零

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

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--;
        }
    }
}
  • 总结:题目挺不是特别难,就是,但是思路可能比较难想一点。
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/981148.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号