【发布时间】:2020-06-29 16:46:14
【问题描述】:
从 CodeSignal 执行 commonCharacterCount。当然是想看看有多少 Character 是相同的。
这是一个例子:
对于s1 = "aabcc" 和s2 = "adcaa",输出应该是
commonCharacterCount(s1, s2) = 3.
字符串有 3 个常用字符 - 2 个“a”和 1 个“c”。
关于构建一个包含每个字符数的地图的想法。然后我想检查地图中的每个值,并检查它们。对于答案,我将在两个地图中添加字符的最小计数。
例如,
s1 = "aabcc" && s2 = "adcaa", mapS1['a'] = 2 && mapS2['a'] = 3, 所以count += min(2,3) = 2
这是我的想法,但正如我提到的那样,在迭代两个地图时遇到了一些问题。
第一次使用地图的值作为计数值。无法确定这是否是在地图中增加值的最佳方式,所以我想我也需要帮助。
提前谢谢你:)
static int res(String s1, String s2) {
HashMap<Character, Integer> mapS1 = new HashMap<>();
HashMap<Character, Integer> mapS2 = new HashMap<>();
int count = 0;
for(int i = 0; i < s1.length(); i++)
mapS1.put(s1.charAt(i), mapS1.getOrDefault(s2.charAt(i), 0) + 1);
for(int i = 0; i < s2.length(); i++)
mapS1.put(s2.charAt(i), mapS2.getOrDefault(s2.charAt(i), 0) + 1);
for(Map.Entry<Character, Integer> entry : mapS1.entrySet()) {
int a = mapS1.get(entry.getKey());
int b = mapS2.get(entry.getKey());
if(a > 0 && b >= 0) count += Math.min(a, b);
}
return count;
}
更正和有效的版本:谢谢大家!
static int res(String s1, String s2) {
HashMap<Character, Integer> mapS1 = new HashMap<>();
HashMap<Character, Integer> mapS2 = new HashMap<>();
int count = 0;
for(int i = 0; i < s1.length(); i++)
mapS1.put(s1.charAt(i), mapS1.getOrDefault(s1.charAt(i), 0) + 1);
for(int i = 0; i < s2.length(); i++)
mapS2.put(s2.charAt(i), mapS2.getOrDefault(s2.charAt(i), 0) + 1);
for(Map.Entry<Character, Integer> entry : mapS1.entrySet()) {
int a = mapS1.getOrDefault(entry.getKey(), 0);
int b = mapS2.getOrDefault(entry.getKey(), 0);
System.out.println(a + " " + b);
count += Math.min(a, b);
}
return count;
}
```
【问题讨论】:
-
你的方法对我来说看起来不错。您具体面临的问题是什么?
-
应该对我的问题提供更多信息,对此感到抱歉。在我的 int b 初始化中获取 NullPointerException
-
尝试使用
getOrDefault(entry.getKey(), 0)代替get()。给定键没有任何值,它返回 null 然后尝试将其分配给 int 变量,这是不可能的,因此是 NPE。 -
成功了!非常感谢,正是我需要的:)
标签: java dictionary iterator