【问题标题】:why doesn't this code work for anagram checking?为什么这段代码不适用于字谜检查?
【发布时间】:2016-04-14 13:41:53
【问题描述】:

我正在尝试在 javascript 中进行字谜检查。为简单起见,假设下面的函数只接受没有任何间距/数字/符号的小写字符串。为什么下面的代码不起作用?

var anagram = function(string1, string2) {
    var string1array = string1.split('').sort();
    var string2array = string2.split('').sort();
    if (string1array == string2array) {
        console.log("they're anagrams");
    }
    else {
        console.log("they are not anagrams");
    }
}

【问题讨论】:

    标签: javascript arrays sorting split anagram


    【解决方案1】:

    == 不适用于Array,因为ArrayObject== 运算符检查 Objects 是否相同:

    var foo = {};
    var bar = {};
    console.log(foo == bar); // false
    var foo2 = {};
    var bar2 = foo2;
    console.log(foo2 == bar2); // true

    因此,最简单的是检查这是将它们转换回String并使用==,因为== 确实String一起工作:

    var anagram = function(string1, string2) {
        var string1array = string1.split('').sort();
        var string2array = string2.split('').sort();
        // All I used was .join('') on both.
        if (string1array.join('') == string2array.join('')) {
            console.log("they're anagrams");
        }
        else {
            console.log("they are not anagrams");
        }
    }

    【讨论】:

      【解决方案2】:

      你不能像在 Javascript 中那样直接比较数组元素。

      这里有多种实现方式可以做到这一点:How to check if two arrays are equal with JavaScript?

      在您的情况下,您可以简单地使用 .join() 来比较两个字符串:

      var anagram = function(string1, string2) {
          var string1_sorted = string1.split('').sort().join('');
          var string2_sorted = string2.split('').sort().join('');
          if (string1_sorted == string2_sorted) {
              console.log("they're anagrams");
          }
          else {
              console.log("they are not anagrams");
          }
      }
      

      【讨论】:

      • 谢谢。没有意识到数组无法比较。
      【解决方案3】:

      我正在尝试在 javascript 中进行字谜检查。

      嗯,这不完全是这个问题的答案,而是解决这个问题的不同方法;在我的第一次测试中,速度更快 (33-50%)。
      Mr_Pouet 和 Andrew Templeton 已经为您提供了这个确切问题的答案。

      function anagram(a, b, caseSensitive){
          if(a.length !== b.length) return false;
          var c = caseSensitive? a: a.toLowerCase(), 
              d = caseSensitive? b: b.toLowerCase(),
              map = new Array(128),
              cc;
      
          for(var i = a.length; i--; ){
              cc = c.charCodeAt(i);
              map[cc] = (map[cc] || 0) + 1;
      
              cc = d.charCodeAt(i);
              map[cc] = (map[cc] || 0) - 1;
          }
      
          var i = map.length;
          if(i < 256){
              //faster for ANSI-like text
              while(i--) 
                  if(i in map && map[i]) return false;
          }else{
              //faster for a huge sparse map, 
              //like UTF8 multibytes (Asian characters for example)
              for(var k in map)
                  if(map[k]) return false;
          }
          return true;
      }
      

      【讨论】:

        猜你喜欢
        • 2021-06-04
        • 1970-01-01
        • 2019-11-20
        • 2022-01-22
        • 2020-11-13
        • 2016-04-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多