【问题标题】:Why is this anagram function not correct?为什么这个字谜函数不正确?
【发布时间】:2017-12-30 05:06:51
【问题描述】:

刚拿回我的 Javascript 课程测试,我错过了一个我非常确定的问题。

我们应该创建一个函数,如果两个字符串是字谜,则返回 true,否则返回 false。我找不到这不起作用的实例。我将不胜感激!

这就是我所拥有的:

function isAnagram(str1, str2){
    if(str1.length !== str2.length){
        return false;
    }
    else{
        for(var i = 0; i < str1.length; i++){
            if(!str2.includes(str1[i])){
                return false;
            }
         }
         return true;
     }
}

【问题讨论】:

  • 你有测试吗?
  • “包含所有相同的字母”和“是一个字谜”不是一回事。
  • 因为isAnagram('aab', 'abb')返回true,而不是false,例如。
  • 好的。谢谢你们的帮助。有什么办法可以稍微修改我的代码来解决这个问题?
  • @Jonas Anagram 也不意味着“反转”。

标签: javascript iteration anagram


【解决方案1】:

替代解决方案。

const isAnagram = (s1, s2) => {
  return lowerify(s1) == lowerify(s2);
}

const lowerify = str => str.toLowerCase().split('').sort().join('');

console.log(isAnagram("Arrigo Boito", "Tobia Gorrio"));
console.log(isAnagram("abc", "CBa"));
console.log(isAnagram("deep", "depp"));

【讨论】:

    【解决方案2】:

    它只检查str1 的每个字母是否出现在str2 中,无论它们出现多少次。

    编辑:它也不检查str2 中是否有str1 中没有出现的字母。

    function isAnagram(str1, str2) {
      if (str1.length !== str2.length) {
        return false;
      } else {
        for (var i = 0; i < str1.length; i++) {
          if (!str2.includes(str1[i])) {
            return false;
          }
        }
        return true;
      }
    }
    
    console.log(isAnagram('hello', 'hlleo'), ', should be true'); // true: correct
    console.log(isAnagram('bye', 'byee'), ', should be false'); // false: correct
    console.log(isAnagram('byeb', 'byee'), ', should be false'); // true: incorrect
    console.log(isAnagram('byeb', 'byte'), ', should be false'); // true: incorrect

    【讨论】:

      【解决方案3】:

      它不能处理你有两个单词,长度相等,使用相同的字母,但每个字母的数字不同的情况。

      这给出了一个误报:

      console.log(isAnagram("deep", "depp"))
      

      【讨论】:

      • 该死,应该已经看到了。感谢您的帮助!
      【解决方案4】:

      例如,因为您的函数会通过此测试:

      isAnagram('abba', 'abbb') === false
      

      【讨论】:

      • 没有。这就是为什么我在最初的案例中检查了它们的长度
      • 对,我忽略了这一点
      【解决方案5】:

      作为一个测试用例,你的代码会返回成功,但违反了作为字谜的规则:

      isAnagram("ooaooa", "oooooa");
      

      它只检查是否存在相同数量的字母,以及单词 a 中的每个字母是否存在于单词 b 中,但不检查两个单词中字母的 count

      【讨论】:

        【解决方案6】:

        单个字符可以在您的函数中出现多次,例如比较 testtttt 会返回 true。 修改函数的一种方法是每次在 for 循环中找到一个字符时从 str2 中删除该字符:

        function isAnagram(str1, str2){
          if(str1.length !== str2.length) return false;
          for(var i = 0; i < str1.length; i++){
            var found = str2.indexOf(str1[i]);
            if(found === -1) return false;
            str2 = str2.substr(0,found) + str2.substr(found + 1)
          }
          return true;
        }
        

        【讨论】:

        • 有道理。谢谢。
        • 添加了一个代码示例,尽管 Kind 用户的解决方案更好。
        【解决方案7】:

        只需逐个字符比较两个字符串并记录您找到的匹配项。总匹配必须 >= 到字符串长度(以适应字符可能重复的情况,例如 boot)

        var i, j;
        var z = 0;
        function checkAnagram(str1, str2) {
            if (str1.length != str2.length) { return `${str1} and ${str2} are not anagram, lengths dont match!`; }
            else {
                for (i = 0; i < str1.length; i++) {
                    for (j = 0; j < str2.length; j++) {
                        if(str1[i] == str2[j]) {
                       // console.log('matches',str1[i],str2[j]);
                        z++;
                        }
                        }
                    }
                  //  console.log(z);
                    if (z>=str1.length)
                    return`${str1} and ${str2} are anagram!`;
                    else return `${str1} and ${str2} are not anagram!`;
                }
        }
        console.log(checkAnagram('fired','fried'));
        console.log(checkAnagram('logo','ogol'));
        console.log(checkAnagram('abcd','abc'));

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2016-04-19
          • 2014-03-20
          • 2019-06-28
          • 1970-01-01
          • 2018-09-15
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多