如何用静态方法统计int数组中唯一非重复数字的数量?
修复统计数组唯一元素数量的代码
我来帮你排查这段代码里的问题,它现在运行起来会直接抛出异常,而且计数逻辑也有漏洞,咱们一步步修正:
原代码存在的问题
- 数组越界异常:循环条件写的是
i<=list.length,数组的下标范围是0到list.length-1,当i等于list.length时访问list[i]肯定越界;而且循环初始i=0时,list[i-1]也就是list[-1],这也是非法的下标,直接触发错误。 - 边界情况未处理:当数组为空或者只有一个元素时,代码直接崩溃,没有做兜底处理。
- 计数逻辑的隐含风险:原代码通过总长度减去重复次数得到唯一数量,但重复次数的统计方式在多组重复元素场景下容易出错,比如三个连续重复元素会被统计两次重复,虽然结果碰巧对,但逻辑不够直观且容易出问题。
修正后的代码
import java.util.Arrays; public class UniqueNumbers { public static void main(String[] args) { int[] test = {1, 2, 4, 5, 10, 30, 20, 1}; int num = numUnique(test); System.out.println(num); // 输出结果为7,符合预期 } public static int numUnique(int[] list) { // 处理空数组或null的情况 if (list == null || list.length == 0) { return 0; } // 只有一个元素时直接返回1 if (list.length == 1) { return 1; } Arrays.sort(list); int uniqueCount = 1; // 排序后至少有一个唯一元素 for (int i = 1; i < list.length; i++) { // 当前元素和前一个不相等,说明是新的唯一元素 if (list[i] != list[i - 1]) { uniqueCount++; } } return uniqueCount; } }
代码逻辑解释
- 先处理边界场景:空数组/直接返回0,单个元素直接返回1,避免后续遍历出问题。
- 对数组排序,让重复元素集中在一起,方便后续比较。
- 初始化
uniqueCount为1,因为排序后数组至少存在一个唯一元素。 - 从下标1开始遍历数组,每次和前一个元素对比:如果不相等,说明遇到了新的唯一元素,计数加1。
- 最后返回统计好的唯一元素数量。
这样修改后,测试数组{1, 2, 4, 5, 10, 30, 20, 1}排序后变为{1,1,2,4,5,10,20,30},遍历后会准确统计到7个唯一元素,和预期完全一致。
内容的提问来源于stack exchange,提问作者S. West
相关产品推荐
相关产品推荐

