为什么这个字谜函数不正确?
Why is this anagram function not correct?
刚拿到 Javascript class 的测试,但我错过了一个我觉得很确定的问题。
我们应该创建一个函数,如果两个字符串是变位词则返回 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('abba', 'abbb') === false
单个字符可以在您的函数中出现多次,例如比较 test
和 tttt
returns 为真。
修改函数的一种方法是每次在 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;
}
它无法处理两个单词的情况,它们的长度相等,使用相同的字母,但每个字母的编号不同。
这给出了误报:
console.log(isAnagram("deep", "depp"))
作为测试用例,您的代码会 return 成功,但违反了变位词的规则:
isAnagram("ooaooa", "oooooa");
它只是检查是否存在相同数量的字母,以及单词 a 中的每个字母是否都出现在单词 b 中,而不是两个单词中字母的 count .
它只检查 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
备选方案。
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"));
只需逐个字符地比较两个字符串并记录找到的匹配项数。总匹配项必须 >= 字符串长度(以适应字符可能重复的情况,例如 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'));
刚拿到 Javascript class 的测试,但我错过了一个我觉得很确定的问题。
我们应该创建一个函数,如果两个字符串是变位词则返回 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('abba', 'abbb') === false
单个字符可以在您的函数中出现多次,例如比较 test
和 tttt
returns 为真。
修改函数的一种方法是每次在 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;
}
它无法处理两个单词的情况,它们的长度相等,使用相同的字母,但每个字母的编号不同。
这给出了误报:
console.log(isAnagram("deep", "depp"))
作为测试用例,您的代码会 return 成功,但违反了变位词的规则:
isAnagram("ooaooa", "oooooa");
它只是检查是否存在相同数量的字母,以及单词 a 中的每个字母是否都出现在单词 b 中,而不是两个单词中字母的 count .
它只检查 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
备选方案。
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"));
只需逐个字符地比较两个字符串并记录找到的匹配项数。总匹配项必须 >= 字符串长度(以适应字符可能重复的情况,例如 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'));