我尝试为字谜编写一个小代码,然后我写下了onw.
String s = "anagram";
String t = "nagara";
Map<Character,Integer> map1 = new HashMap<Character,Integer>();
Map<Character,Integer> map2 = new HashMap<Character,Integer>();
if (s.length() != t.length()) {
System.out.println("Not an anagram");
} else {
for (int i= 0;i<s.length();i++) {
char c = s.charAt(i);
char d = t.charAt(i);
if (map1.containsKey(c)) {
map1.put(c, map1.get(c)+1);
} else {
map1.put(c,1);
}
if (map2.containsKey(d)) {
map2.put(d, map2.get(d)+1);
} else {
map2.put(d,1);
}
}
for (Map.Entry<Character, Integer> entry : map1.entrySet()) {
if (!map2.containsKey(entry.getKey())) {
System.out.println("Not an anagram");
} else if (entry.getValue() != map2.get(entry.getKey())) {
System.out.println("Not an anagram");
}
}
}
这适用于几乎所有情况,但是当我输入leetcode进行检查时,它会失败,其中一个最长的字谜有50000个字符.
有人能够指出我在这里看错了什么?
解决方法:
您是Integer
caching的受害者,其值介于-128和127之间.
当您计算两个单词中的字符数时,将值作为盒装的Integer对象放入地图中,您需要将它们作为对象进行比较,而不是作为值进行比较.
问题是这一行:
else if (entry.getValue() != map2.get(entry.getKey()))
在这里,您将两个Integer对象与!=进行比较而不是使用
else if (!entry.getValue().equals(map2.get(entry.getKey())))
这适用于短词的原因是每个字符的出现次数不超过127的神奇值.
这些值缓存在Integer类中,因此小于(和等于)该值的盒装整数是相同的,而大于该值的盒装整数是具有相等值的不同对象.
标签:anagram,java,string 来源: https://codeday.me/bug/20190727/1557481.html
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。