通过万岁!!!
- 题目:就是给你一个数组,然后遇到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--;
}
}
}
- 总结:题目挺不是特别难,就是,但是思路可能比较难想一点。



