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

Java整数分组统计代码中HashSet始终为空问题排查

问题分析与代码修正

我帮你找出了代码里的几个关键问题,这才导致setOfGroupsExposed始终为空,咱们一步步来梳理:

核心错误点

  1. 结果变量初始化时机错误
    你在循环开始前就把res赋值为setOfGroupsExposed.size(),这时候集合还没处理任何元素,肯定是空的。后续循环中集合添加元素后,res不会自动更新,最后返回的自然是0。

  2. 内层循环的条件逻辑完全错误
    代码里的list.get(j++)是致命问题:

    • 后置递增j++会让你调用list.get(j)时,还是用原来的j值,之后j才会加1。比如j=0时,list.get(j)是1,list.get(j++)还是1,这样判断条件a[i] >=1 && a[i]<1永远不可能成立,根本不会往集合里加元素。
    • 同时这个j++会让内层循环的j额外递增一次,导致很多分组直接被跳过,没机会检查。
  3. 分组范围的判断不符合需求
    题目要求的分组是1-10000、10001-20000…直到1000000,也就是每组的区间是[start, start+9999](等价于start <= num < start+10000),你原来的代码没有正确定义这个上限。

  4. 分组列表生成冗余且范围有误
    你用limit(101)生成了101个起始值,最后一个是1+100*10000=1000001,这超出了题目要求的1000000上限,实际只需要100组就够了。


修正后的代码(保留原逻辑思路)

下面是修复了所有问题的版本,保留了你用列表存储起始值的思路:

static int countingGroups(int[] a) {
    Set<Integer> setOfGroupsExposed = new HashSet<>();
    // 生成100组的起始值:1, 10001, ..., 990001,刚好覆盖1-1000000
    List<Integer> groupStarts = IntStream.iterate(1, i -> i + 10000)
                                         .limit(100)
                                         .boxed()
                                         .collect(Collectors.toList());
    
    for (int num : a) {
        for (int j = 0; j < groupStarts.size(); j++) {
            int start = groupStarts.get(j);
            // 正确判断当前数字属于哪个分组区间
            if (num >= start && num < start + 10000) {
                // 分组编号从1开始(对应题目里的第1组、第2组...)
                setOfGroupsExposed.add(j + 1);
                // 找到对应分组后直接跳出内层循环,避免无效遍历
                break;
            }
        }
    }
    // 最后返回集合的大小,这才是实际统计的分组数量
    return setOfGroupsExposed.size();
}

更高效的优化版本(无需生成列表)

其实完全不需要提前生成分组起始列表,通过简单的数学计算就能直接得到数字所属的分组,这样代码更简洁高效,还避免了嵌套循环:

static int countingGroups(int[] a) {
    Set<Integer> setOfGroupsExposed = new HashSet<>();
    for (int num : a) {
        // 核心计算逻辑:通过整数除法直接得到分组编号
        // 示例:num=2 → (2-1)/10000 +1 = 0+1=1;num=10000 → (10000-1)/10000 +1=0+1=1;num=10001 → (10001-1)/10000 +1=1+1=2
        int group = (num - 1) / 10000 + 1;
        // 确保分组在题目要求的1-100范围内(防止输入超出1000000的情况)
        if (group >= 1 && group <= 100) {
            setOfGroupsExposed.add(group);
        }
    }
    return setOfGroupsExposed.size();
}

这个优化版本的原理是:用(num-1)把数字的区间平移,让1-10000对应0-9999,除以10000后得到0,加1就是第1组;10001-20000对应10000-19999,除以10000得到1,加1就是第2组,以此类推,刚好完美匹配题目要求的分组规则。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 08:42:40