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
相关产品推荐
相关产品推荐

