为什么这个字谜功能不正确?

时间:2017-07-24 14:43:56

标签: javascript iteration anagram

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

如果两个字符串是anagrams,我们应该创建一个返回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;
     }
}

6 个答案:

答案 0 :(得分:3)

替代解决方案。

&#13;
&#13;
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"));
&#13;
&#13;
&#13;

答案 1 :(得分:2)

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

这给出了误报:

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

答案 2 :(得分: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 :(得分:1)

因为你的功能会失败,所以:

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

答案 4 :(得分:1)

单个字符可以在函数中多次出现,例如比较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;
}

答案 5 :(得分:1)

作为测试用例,您的代码会在此处返回成功,但违反了作为anagram的规则:

isAnagram("ooaooa", "oooooa");

它只检查是否存在相同数量的字母,以及字b中的每个字母是否出现在字b中,而不是两个字中字母的 count