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

使用快慢双指针移除数组目标元素出现索引越界错误如何解决

问题根因
  • 内层循环的判断顺序错误:你先访问了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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 00:15:03