每日一题:复写0
https://leetcode.cn/problems/duplicate-zeros/
如何避免从左至右遍历每次碰到0都进行搬移的大量重复操作?
方法一:两次遍历,倒序搬移:
- 第一次遍历,记录0的个数。
- 第二次遍历,从右至左:
维护当前下标i之前的0的个数zeroCount,如当前下标i之前有n个0,那么当前下标i应当被右移n位,在移动之前应当做越界判断。
若当前下标对应数字为0,那么不仅要把这个0移动到n位之后,也要在移动后的左一位也加一个0,并且要把zeroCount减1。
public void duplicateZeros(int[] arr) {
//记录0的个数
int zeroCount=0;
for(int num:arr){
if(num==0){
zeroCount++;
}
}
//倒序遍历数组
for(int i=arr.length-1;i>=0;i--){
boolean isZero = arr[i]==0;
//移动,防止越界
if(i+zeroCount<arr.length){
arr[i+zeroCount]=arr[i];
}
if(isZero){
if(i+zeroCount-1<arr.length){
arr[i+zeroCount-1]=arr[i];
}
zeroCount--;
}
}
}

浙公网安备 33010602011771号