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

