解题思路:
1. int cnt=0;计数包含复写的0在内的元素个数。
int j=-1;为了复写0,原数组的应该结束的下标。
2.遍历原数组,如果遇到0,则cnt加2,否则,cnt加1。如果cnt>=len,记录下当前的数组索引,即j=i,结束循环
3.从后向前遍历j+1个数组,如果cnt>len,则最后一位,即arr[j]处的数组直接赋值给arr[len-1]
4.如果当前遍历到的是0,则连续两次输出0。
5.如果当前遍历到的不是0,则将原数组输出
代码实现:
class Solution {
public void duplicateZeros(int[] arr) {
int len=arr.length;
int cnt=0;//包含复写的0在内的元素个数
int j=-1;//记录应该遍历到的原数组的下标
for(int i=0;i<len;++i){
if(arr[i]==0){
cnt+=2;
}
else{
cnt++;
}
if(cnt>=len){
j=i;
break;
}
}
int index=len-1;
boolean flag=false;
while(j>=0&&index>=0){
if(cnt>len&&!flag){//说明最后一个如果是0,则要少复写一个0
arr[index--]=arr[j--];
flag=true;
continue;
}
if(arr[j]==0){
arr[index--]=0;
arr[index--]=0;
j--;
}
else{
arr[index--]=arr[j--];
}
}
}
}