题目:
解析:
我们先创建两个指针变量,一个cur指针指向数组的序列为0的位置,一个dest指针指向数组序列为-1的位置,先从前往后遍历一遍,找到边界值cur,然后再重后往前遍历复写0。
边界值cur的查找:在遍历的时候当arr[cur]非零数字时,dest就向前进一步,如果遇到零数字时就向前两步,这一步走完后我们要先判断dest是否越界,如果走到数组的最后一位时,就退出该循环,这时候cur指向的就是边界值。
从后往前遍历复写0:这个时候我们的dest为最后一个值,cur为边界值,然后就往前遍历。如果arr[cur]为非零数字时,dest就与cur位置的值交换,同时进行-1的操作,如果为零数字时,dest和dest-1的位置就为0,并再进行一次-1的操作。
特殊情况:当数组长度-2位置的值为0,dest就会越界,这个时候我们就需要判断dest是否=n,如果是就将cur[n-1]赋值为0,cur向前一步,dest向前两步。
代码:
class Solution {
public void duplicateZeros(int[] arr) {
int cur=0,dest=-1,n=arr.length;
while(dest<n){
if(arr[cur]!=0){
dest++;
}else{
dest+=2;
}
if(dest>=n-1){
break;
}
cur++;
}
if(dest>=n){
dest-=2;
cur--;
arr[n-1]=0;
}
while(cur>=0){
if(arr[cur]!=0){
arr[dest--]=arr[cur--];
}else{
arr[dest--]=0;
arr[dest--]=0;
cur--;
}
}
}
}