每日一题:复写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 @   吉比特  阅读(41)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 周边上新:园子的第一款马克杯温暖上架
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· DeepSeek如何颠覆传统软件测试?测试工程师会被淘汰吗?
· 使用C#创建一个MCP客户端
欢迎阅读『每日一题:复写0』
点击右上角即可分享
微信分享提示
主题色彩