如何去除给定数组中的重复整数?代码运行遇数组越界异常求助
解决数组去重时的数组越界异常(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
相关产品推荐
相关产品推荐

