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--;
        }
    }
}
  • 总结:题目挺不是特别难,就是,但是思路可能比较难想一点。

你可能感兴趣的:(算法,leetcode,算法,java,双指针)