【问题标题】:Valid anagrams code - fails for one case out of 32 cases. passes for 31 cases有效的字谜代码 - 32 个案例中的一个案例失败。 31例通过
【发布时间】:2015-12-22 00:59:57
【问题描述】:

我尝试为字谜编写一个小代码,然后我写了下面的 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 个字符的最长字谜之一,它失败了。 谁能指出我这里看起来有什么问题?

【问题讨论】:

  • entry.getValue() != map2.get(entry.getKey()) 将测试 Integer 对象身份。试试!entry.getValue().equals(map2.get(entry.getKey()))。不确定这是否会回答您的问题,因为我无法尝试您的测试用例。
  • 到底是什么失败了?您收到错误消息吗?
  • 是的。这很好用。谢谢

标签: java string anagram


【解决方案1】:

对于介于 -128 和 +127 之间的值,您是 Integer caching 的受害者。

当您计算两个单词中的字符数时,将值作为 boxed Integer 对象放入地图中,您需要将它们作为 对象 进行比较,而不是作为

问题出在这一行:

else if (entry.getValue() != map2.get(entry.getKey()))

在这里,您将两个 Integer 对象与 != 进行比较,而不是使用

else if (!entry.getValue().equals(map2.get(entry.getKey())))

这对短词有效的原因是每个字符的出现次数不超过127的神奇值。

这些值被缓存在Integer 类中,因此小于(等于)该值的装箱整数是相同的,而大于该值的装箱整数是具有相等值。

【讨论】:

    猜你喜欢
    • 2013-11-23
    • 2020-08-29
    • 2016-10-09
    • 1970-01-01
    • 2018-10-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-08
    相关资源
    最近更新 更多