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

LeetCode重复零问题:Java实现报数组越界异常原因求解

问题分析

1. 数组越界的直接原因

数组的合法索引范围是0到arr.length - 1,你设置的循环终止条件为i < length,当i遍历到数组最后一个元素(索引为length - 1)时,如果该元素是0,执行arr[i+1] = arr[i]会访问索引为length的非法位置。你使用的测试用例数组长度为8,最大合法索引是7,当i=7时i+1=8,就触发了你遇到的越界报错。

你提交的问题代码如下:

public void duplicateZeros(int[] arr) {
    int length = arr.length;
    for(int i=0;i<length;i++){
        if(arr[i]==0){
          arr[i+1]=arr[i];
        }
    }
}

2. 现有代码的其他逻辑缺陷

就算修复了越界问题,当前代码也无法满足题目要求,还存在两个核心问题:

  • 没有实现元素右移逻辑:直接将i+1位置的元素覆盖为0,会直接丢失该位置原本的数值,没有完成其余元素整体右移的要求。
  • 重复复制问题:在i位置复制0到i+1后,下一轮循环遍历到i+1时,会把新复制的0再次判定为需要复制的对象,最终会导致数组后续全被填充为0,和预期输出不符。

修复参考思路

要正确实现需求可采用双指针两次遍历方案,避免正向遍历覆盖未处理元素:

  1. 第一次正向遍历,统计原数组中可保留的元素总数,确定复制零后最后一个有效元素的位置
  2. 第二次从后往前遍历,遇到0就写入两次,非0就写入一次,超出数组长度的元素直接丢弃即可

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 15:06:04