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

如何去除给定数组中的重复整数?代码运行遇数组越界异常求助

解决数组去重时的数组越界异常(Out of Bounds Exception)

嘿,我看到你在实现removeDuplicateInts方法去重int数组的时候碰到了数组越界异常,结合你给出的需求和测试用例,我来帮你排查问题并给出可行的解决方案~

先明确你的需求和测试用例

需求:给定一个int数组,移除重复整数后返回新的int数组。
测试用例:

  • removeDuplicateInts({3}) → {3}
  • removeDuplicateInts({1, 2}) → {1, 2}
  • removeDuplicateInts({7, 7}) → {7}
  • removeDuplicateInts({1, 7, 1, 7, 1}) → {1, 7}
  • removeDuplicateInts({1, 2, 3, 4, 5}) → {1, 2, 3, 4, 5}
  • removeDuplicateInts({1, 2, 3, 2, 4, 2, 5, 2}) → {1, 2, 3, 4, 5}

可能导致数组越界的常见原因

你遇到的ArrayIndexOutOfBoundsException大概率是这几个情况:

  • 手动创建结果数组时,长度估算错误(比如直接用原数组长度,但去重后实际长度更小,填充时索引超出了结果数组的边界)
  • 遍历数组时循环条件写错(比如循环范围超过了数组的实际长度)
  • 没有处理空数组、单元素数组这类边界情况,导致代码尝试访问不存在的索引

解决方案1:用LinkedHashSet保持顺序并去重(简单直观)

这个方法能自动处理去重,还能保留元素在原数组中的出现顺序,完全不会出现越界问题:

import java.util.LinkedHashSet;
import java.util.Set;

public class ArrayUtils {
    public static int[] removeDuplicateInts(int[] input) {
        // 处理空数组或null的边界情况
        if (input == null || input.length == 0) {
            return new int[0];
        }
        
        // LinkedHashSet既去重又保持插入顺序
        Set<Integer> uniqueElements = new LinkedHashSet<>();
        for (int num : input) {
            uniqueElements.add(num);
        }
        
        // 根据去重后的元素数量创建结果数组
        int[] result = new int[uniqueElements.size()];
        int index = 0;
        for (int num : uniqueElements) {
            result[index++] = num;
        }
        
        return result;
    }
}

解决方案2:双指针法(空间更高效,适合不需要保持原顺序的场景)

如果不要求保留原数组的元素顺序,这个方法的空间复杂度更低(仅排序需要额外空间,其余操作在原数组上完成):

import java.util.Arrays;

public class ArrayUtils {
    public static int[] removeDuplicateInts(int[] input) {
        if (input == null || input.length == 0) {
            return new int[0];
        }
        
        // 先排序,让重复元素相邻
        Arrays.sort(input);
        
        int uniquePointer = 0;
        // 遍历数组,把不重复的元素移到前面
        for (int i = 1; i < input.length; i++) {
            if (input[i] != input[uniquePointer]) {
                uniquePointer++;
                input[uniquePointer] = input[i];
            }
        }
        
        // 截取去重后的有效部分返回
        return Arrays.copyOf(input, uniquePointer + 1);
    }
}

验证测试用例

把上面的代码替换你原来的实现,再跑你给出的测试用例,应该都能得到正确结果,而且不会再抛出数组越界异常啦~

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 07:31:22