题目
解题思路:
2)处理边界情况
这种情况越界会发生报错
处理边界情况
3) 双指针法 "从后向前" 完成复写操作
cur指向 最后一个复写的数 , 用cur指向的元素复写dest指向元素, 随后cur, dest 均向前移动一位
此时cur指向零元素, 需要复写两位, 复写两个元素的dest 前移两位如下
移动完dest后 移动cur指针, 进行下一轮循环复写
继续先后移动dest 指向下标3位置, cur 指向下标2 位置, 执行循环复写操作
上图复写完后继续移动cur dest指针, cur 指向 零元素, 复写两次,
dest 向前移动位, 再次在自身上复写
最后均移动至-1 结束
class Solution {
public void duplicateZeros(int[] arr) {
int cur = 0, dest = -1;
while(cur < arr.length) {
if(arr[cur] == 0) {
dest++;
}
dest++;
if(dest >= arr.length-1) {
break;
}
cur++;
}
if(dest >= arr.length) {
arr[arr.length-1] = 0;
cur--;
dest-=2;
}
while(cur >= 0) {
if(arr[cur] == 0) {
arr[dest--] = 0;
arr[dest--] = 0;
cur--;
} else {
arr[dest--] = arr[cur--];
}
}
}
}