方法一:1.计算0的个数,扩充数组(虚拟),从后开始遍历数组,依次判断是否为0,以及是否超过数组长度,放入虚拟数组。
class Solution {
public void duplicateZeros(int[] arr) {
int count=0;
for(int i=0;i<arr.length;i++){
if(arr[i]==0){
count++;
}
}
int len=arr.length+count;
for(int i=arr.length-1,j=len-1;i>=0;i--,j--){//这里i>=0,可以用j>i替代
if(arr[i]!=0){
if(j<arr.length){
arr[j]=arr[i];
}
}else{
if(j<arr.length){
arr[j]=arr[i];
}
j--;
if(j<arr.length){
arr[j]=arr[i];
}
}
}
}
}
方法2:从头开始遍历,如果遇到0,就把0后面的统统向后移动一个位置,注意一些细节
class Solution {
public void duplicateZeros(int[] arr) {
for(int i=0;i<arr.length;i++){
if(arr[i]==0){
move(arr,i+1);
if(i+1<arr.length){
arr[i+1]=0;
}
i++;//这个步骤不要忘了
}
}
}
public void move(int[] arr,int index){
for(int j=arr.length-1;j>index;j--){
arr[j]=arr[j-1];
}
}
}