为啥这个字谜函数不正确?

Posted

技术标签:

【中文标题】为啥这个字谜函数不正确?【英文标题】: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 也不意味着“反转”。 【参考方案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'));

【讨论】:

以上是关于为啥这个字谜函数不正确?的主要内容,如果未能解决你的问题,请参考以下文章

为啥这个 stl 函数调用会导致不正确的布尔评估? [复制]

为啥 TypeScript 4 转译器没有看到这个不正确的类型传递给函数?

字谜/部分字谜检测算法找到不正确的答案

为啥 TensorFlow 模型报告的预测置信度不正确?

无法正确按字谜分组

在 SELECT 语句中使用自定义函数时,为啥我的 SQL 查询的输出显示不正确?