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,和预期输出不符。
修复参考思路
要正确实现需求可采用双指针两次遍历方案,避免正向遍历覆盖未处理元素:
- 第一次正向遍历,统计原数组中可保留的元素总数,确定复制零后最后一个有效元素的位置
- 第二次从后往前遍历,遇到0就写入两次,非0就写入一次,超出数组长度的元素直接丢弃即可
内容的提问来源于stack exchange,提问作者ProgramCOder
相关产品推荐
相关产品推荐

