You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Java函数修复:求数组中两个零元素间非零元素的最大数量

修复Java中计算两个零之间非零元素最大数量的函数错误

我们需要实现一个函数:输入整数数组,找出两个零元素之间非零元素的最大数量。已知以下测试场景:

  • 示例数组{1,2,0,2,3,4,5,0,1,2,3,4,5,6,7,8,8,0,1},正确返回值应为9(第二个零与第三个零之间的9个非零元素)
  • 特殊场景数组{1,2,3,0,0,3,2,1},应返回0(两个零之间无任何非零元素)

但以下Java函数无法正确处理这些场景,示例中会返回4:

static int solution(int[] arr) {
    int count = 0;
    int maxCount = 0;

    for (int i = 0; i < arr.length - 1; i++) {
        if (arr[i] == 0 && i < arr.length - 2) {
            i++;
            while (arr[i] != 0) {
                count++;
                i++;
            }
            maxCount = count;
        }
    }
    return maxCount;
}

原代码的核心问题

  1. 未重置统计计数器:每次统计完一段非零元素后,count变量不会清零,后续统计会在旧值基础上累加,导致数值错误。
  2. 最大值更新逻辑错误:直接将count赋值给maxCount,若后续统计的数值更小,会覆盖之前的最大值,无法保留真正的最大数量。
  3. 循环边界与越界风险:for循环的i < arr.length -1和内部i < arr.length -2的判断,会遗漏数组末尾的元素;同时内部while循环未检查i是否超出数组长度,存在数组越界风险。
  4. 连续零场景未处理:当两个零相邻时,函数不会计算这种情况的数量,导致无法返回正确的0。

修复后的代码

static int solution(int[] arr) {
    int maxCount = 0;
    int lastZeroIndex = -1; // 记录上一个零元素的索引,初始值表示未遇到零

    for (int i = 0; i < arr.length; i++) {
        if (arr[i] == 0) {
            // 仅当已经遇到过前一个零时,才计算两个零之间的元素数量
            if (lastZeroIndex != -1) {
                // 计算逻辑:当前零索引 - 上一个零索引 - 1(排除两个零本身)
                int currentCount = i - lastZeroIndex - 1;
                maxCount = Math.max(maxCount, currentCount);
            }
            // 更新上一个零的索引为当前位置
            lastZeroIndex = i;
        }
    }
    return maxCount;
}

修复逻辑说明

  • 用lastZeroIndex追踪上一个零的位置,初始值-1表示还未遇到任何零。
  • 每次遇到零时,若已有前一个零的记录,直接通过索引差计算两个零之间的非零元素数量,避免逐一遍历统计的冗余。
  • 使用Math.max确保每次只保留最大的统计值,不会被更小的数值覆盖。
  • 自然处理连续零的场景:两个相邻零的索引差为1,计算后得到0,符合需求。

测试验证

  • 示例数组:第二个零在索引7,第三个零在索引17,计算得17-7-1=9,正确返回9。
  • 连续零场景:两个零在索引3和4,计算得4-3-1=0,正确返回0。

内容的提问来源于stack exchange,提问作者Ivan Dvurechenskiy

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.09 21:01:40