Loading

每日一题:复写0

https://leetcode.cn/problems/duplicate-zeros/
如何避免从左至右遍历每次碰到0都进行搬移的大量重复操作?

方法一:两次遍历,倒序搬移:

  1. 第一次遍历,记录0的个数。
  2. 第二次遍历,从右至左:
    维护当前下标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--;
        }
    }
}

方法二:双指针

posted @ 2022-06-19 13:00  吉比特  阅读(49)  评论(0)    收藏  举报