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

如何用静态方法统计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;
    }
}

代码逻辑解释

  1. 先处理边界场景:空数组/直接返回0,单个元素直接返回1,避免后续遍历出问题。
  2. 对数组排序,让重复元素集中在一起,方便后续比较。
  3. 初始化uniqueCount为1,因为排序后数组至少存在一个唯一元素。
  4. 从下标1开始遍历数组,每次和前一个元素对比:如果不相等,说明遇到了新的唯一元素,计数加1。
  5. 最后返回统计好的唯一元素数量。

这样修改后,测试数组{1, 2, 4, 5, 10, 30, 20, 1}排序后变为{1,1,2,4,5,10,20,30},遍历后会准确统计到7个唯一元素,和预期完全一致。

内容的提问来源于stack exchange,提问作者S. West

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 09:03:57