我把这段代码写成了练习的一部分,以检查天气或不是字符串是回文。他们的程序在检查字符串方面正常工作但是当字符串不是回文时它不会返回false。我究竟做错了什么?感谢
//convert the string to array
var stringArr = [ ];
var bool;
function palindrome(str) {
// make lowercase
var lowerCase = str.toLowerCase();
//remove numbers, special characters, and white spaces
var noNumbers = lowerCase.replace(/[0-9]/g, '');
var noSpecials = noNumbers.replace(/\W+/g, " ");
var finalString = noSpecials.replace(/\s/g, '');
stringArr = finalString.split("");
if (stringArr.sort(frontToBack)==stringArr.sort(backToFront)) {
bool = true;
}
else {
bool= false;
}
return bool;
}
function frontToBack (a,b) {return a-b;}
function backToFront (a,b) {return b-a;}
palindrome("eye");
答案 0 :(得分:1)
if (stringArr.sort(frontToBack)==stringArr.sort(backToFront)) {
是您的问题。
在JavaScript中,sort
方法更新要排序的变量的值。所以在你的比较中,一旦两个排序都运行,两者都会得到相同的值(因为第二个排序,有效地覆盖了第一个排序)。
例如。
var a = [1,7,3];
a.sort();
console.log(a); // will print 1,3,7
编辑:进行了快速测试,我认为eavidan的建议可能是最好的。
Edit2:只需拼凑一个有希望工作的回文功能的快速版本:)
function palindrome(str) { return str.split("").reverse().join("") == str;}
答案 1 :(得分:0)
这是因为字符串减法产生NaN
,这意味着两个排序的数组都与原始数组相同。
即使您确实转换为ASCII编码,您也会对整个字符串进行排序,然后例如字符串abba
将从前到后排序为aabb
并返回到前面bbaa
。 (编辑以及Carl写的关于sort
改变原始数组的内容。仍然 - 排序不是这里的方式)
你应该做的只是反转字符串(使用数组上的reverse
)并进行比较。
答案 2 :(得分:0)
您可以执行以下操作;
var isPalindrome = s => { var t = s.toLowerCase()
.replace(/\s+/g,"");
return [].slice.call(t)
.reverse()
.every((b,i) => b === t[i]);
};
console.log(isPalindrome("Was it a car or a cat I saw"));
console.log(isPalindrome("This is not a palindrome"));