目录
一、题目介绍

二、双指针原理
扩容遍历指针 、当前维护指针 从小维护到大
1.当前维护指针
1.2维护要求
(1)不能覆盖掉未产效元素
超前式覆盖 就从结果后位开始 往回 ++变回++ ++在后追赶++ 逆序维护
三、提交代码

java
public void duplicateZeros(int[] arr) {
//省去维护的覆盖 到结果后位,就成直接数步子了:
int cur = 0;
int dest = 0;
while(dest < arr.length) {
if(arr[cur] == 0) {
dest += 2;
}else {
dest += 1;
}
cur++;
}
//从结果后位开始 往回在后追赶 逆序维护:
if(dest == arr.length) {
//两指针指向的 都是自然再向后移动到的,指向的 并未展开 对着覆值操作的,此时都往回一步就到 数组末尾操作值位置
dest--;
cur--;
}
if(dest > arr.length) {
dest--;
cur--;
//两指针都往回移回一步后 就可以对着开始 往回覆值操作了,但这里dest指向的是越界处,得手动 覆值调一下
arr[dest - 1] = arr[cur];//一定是之前cur指向了0的连续导致的,往回一步后的此时arr[cur]一定是0,连续覆两次
dest -= 2;
cur--;
}
while(cur >= 0) {
if(arr[cur] == 0) {
arr[dest] = 0;
arr[dest-1] = 0;
dest -= 2;
}else {
arr[dest] = arr[cur];
dest--;
}
cur--;
}
}
