双指针
解法思路:如图

虽然得到了正确答案,但从5下标开始复写是我们知道答案后看出来的。
但是我们从这知道只要能找到最后一个需要复写的数的下标就行了,因此我们构思出一个这样的代码:
cur和dest从0下标开始从前往后遍历原数组,只要cur遇到0,dest就向前移动2次,否则移动一次,直到dest>=nums.length-1就退出循环(注意,需要判断,如果dest==nums.length,dest=nums.length-1),这时cur也到达最后需要复写的下标。
cur和dest 位置均正确之后复写零问题思路也就结束了
代码实现:
java
public void duplicateZeros(int[] arr) {
int cur=0;
int dest=-1;
while(dest<arr.length-1){ //找位置
if(arr[cur]==0){
dest+=2;
}else{
dest+=1;
}
if(dest>=arr.length-1) break;
cur++;
}
while(cur>=0){
if(dest==arr.length){
arr[dest-1]=0;
dest-=2;
}
else{
if(dest>0){
if(arr[cur]==0){
arr[dest]=0;
arr[dest-1]=0;
dest-=2;
}else{
arr[dest]=arr[cur];
dest-=1;
}
}
}
cur--;
}
}