为啥这个字谜函数不正确?
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】:单个字符可以在您的函数中出现多次,例如比较 test
和 tttt
会返回 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 函数调用会导致不正确的布尔评估? [复制]