稀疏数组(HashMap实现)问题排查:代码仅通过3个测试用例求解决
问题排查与修复:稀疏数组查询统计的Java代码
你遇到的问题是代码只通过了部分测试用例,核心原因是你的实现没有考虑查询字符串数组中存在重复元素的情况,咱们一步步拆解来看:
你的代码存在的问题
你当前的思路是把查询字符串作为key、对应的索引作为value存入HashMap,但HashMap的key是唯一的——如果queries里有重复的字符串(比如["ab", "ab"]),后面的put操作会直接覆盖前面的索引值。
举个具体的例子:
如果queries是["ab", "ab"],你的map最后只会保存"ab" → 1,遍历输入strings的两个"ab"时,只会给result_arr[1]累加计数,最终返回[0,2],但正确结果应该是[2,2],这就导致所有包含重复查询的测试用例全部失败。
修正后的实现思路与代码
正确的做法应该是先统计输入字符串的出现次数,再逐个处理查询,这样不管查询有没有重复,都能正确返回每个查询的结果:
static int[] matchingStrings(String[] strings, String[] queries) { int[] resultArr = new int[queries.length]; HashMap<String, Integer> countMap = new HashMap<>(); // 第一步:统计输入字符串中每个元素的出现次数 for (String s : strings) { countMap.put(s, countMap.getOrDefault(s, 0) + 1); } // 第二步:遍历查询数组,获取每个查询的次数 for (int i = 0; i < queries.length; i++) { resultArr[i] = countMap.getOrDefault(queries[i], 0); } return resultArr; }
代码说明
- 第一步遍历输入的
strings数组,用getOrDefault方法简化统计逻辑:如果字符串已在map中,就取当前次数加1;如果不存在,就默认0加1。 - 第二步遍历查询数组,直接从map中取出对应字符串的次数,不存在则返回0,赋值给结果数组对应索引的位置。
- 这种方式的时间复杂度是O(n+m)(n是输入字符串数量,m是查询数量),效率很高,同时完美处理了查询数组有重复元素的情况。
内容的提问来源于stack exchange,提问作者mystica
相关产品推荐
相关产品推荐

