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

Java使用HashMap识别重复DNA序列时值不更新问题排查

问题原因与修复方案

错误原因

你代码的核心问题出在循环内的hm.put(temp,1)调用:无论该子串之前在HashMap中存储的计数是多少,这个调用都会直接把对应值覆盖为1,完全打乱了你预设的计数逻辑。

我们以输入"AAAAAAAAAAAAA"为例拆解执行过程:

  • 第一个子串(下标0-9):hm.put(temp,1)返回null,不进入if块,HashMap中该子串值为1
  • 第二个子串(下标1-10):先执行hm.put(temp,1),把原值1覆盖为1,返回旧值1≠null进入if块,此时get到的值是1,加入列表,再把值更新为2
  • 第三个子串(下标2-11):先执行hm.put(temp,1),把原值2覆盖为1,返回旧值2≠null进入if块,此时get到的值又是1,再次加入列表,再把值更新为2
  • 后续重复子串都会重复上面的逻辑,导致每次都把值先改回1,触发列表添加逻辑

这就是你控制台每次打印都是1、最终列表出现重复项的根本原因,不是HashMap有异常,是你的调用顺序逻辑错误。

修复逻辑

调整执行顺序,不要上来就覆盖计数:

  • 先查询当前子串的已有计数
  • 计数为空说明第一次出现,存入计数1
  • 计数为1说明第二次出现,加入结果列表,更新计数为2避免后续重复添加
  • 计数≥2说明已经加入过列表,无需处理

修复后代码

class Solution {
    public List<String> findRepeatedDnaSequences(String s) {
        int beginWindow = 0;
        List<String> ls = new ArrayList<>();
        HashMap<String, Integer> hm = new HashMap<>();
        while (beginWindow + 10 <= s.length()) {
            String temp = s.substring(beginWindow, beginWindow + 10);
            Integer count = hm.get(temp);
            if (count == null) {
                // 第一次出现,存入计数1
                hm.put(temp, 1);
            } else if (count == 1) {
                // 第二次出现,加入结果,更新计数为2
                ls.add(temp);
                hm.put(temp, 2);
            }
            // 计数≥2时直接跳过,无需处理
            beginWindow++;
        }
        return ls;
    }
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.14 17:39:05