使用快慢双指针移除数组目标元素出现索引越界错误如何解决
问题根因
- 内层循环的判断顺序错误:你先访问了
input[fast]判断元素是否等于目标值,再执行fast < input.length的边界校验。当fast等于数组长度时,会先触发数组越界访问,边界校验完全不生效。 - 内层循环结束后无边界判断:当数组末尾全为待移除的目标值时,内层循环执行完后fast已经等于数组长度,此时直接执行
input[slow++] = input[fast++]会再次触发越界。
修复后代码
import java.util.Arrays; public int[] removeElement(int[] input, int value) { int slow = 0; int fast = 0; while (fast < input.length) { // 调整判断顺序,先校验边界再访问数组元素 while (fast < input.length && input[fast] == value) { fast++; } // 仅fast未越界时才执行赋值 if (fast < input.length) { input[slow++] = input[fast++]; } } return Arrays.copyOfRange(input, 0, slow); }
更简洁的实现方案
不需要嵌套内层循环,单轮循环即可实现同等逻辑,可读性更高:
import java.util.Arrays; public int[] removeElement(int[] input, int value) { int slow = 0; for (int fast = 0; fast < input.length; fast++) { if (input[fast] != value) { input[slow++] = input[fast]; } } return Arrays.copyOfRange(input, 0, slow); }
内容的提问来源于stack exchange,提问作者elmirage888
相关产品推荐
相关产品推荐

