我无法弄清楚为什么下面的代码不能用于Coderbyte挑战,你必须测试一个字符串以查看它是否是回文(当反正读取它们时,字符是相同的)。我知道有更好的方法来为相同的结果编写代码,但我仍然认为这种方式应该有效(假设输入字符串中没有大写字母或非字母字符)。但测试它并不能产生我需要的结果。这是:
function Palindrome(str) {
var myArray = str.split("");
for(var i = 0; i < myArray.length; i++) {
if(myArray[i] === " ") {
myArray.splice(i, 1);
}
}
var firstHalf = myArray.slice(0, Math.floor(myArray.length/2));
var secHalf = myArray.slice(Math.ceil(myArray.length/2));
secHalf.reverse();
if(firstHalf === secHalf) {
return true;
}
return false;
}
我要做的是将输入字符串拆分为数组,删除空格,指定该数组的前半部分和后半部分,反转后半部分,然后比较两半是否相等。如果字符串str
中的字符数为奇数,则不考虑中间字符,因为它无关紧要。我确实试过在Coderbyte上问这个问题,但我的问题并没有因为某些原因而发布。
答案 0 :(得分:0)
您无法使用===
进行数组比较,因为它会检查对象引用是否相等(变量引用相同的数组)。
例如:
var a = [1, 2, 3];
var b = [1, 2, 3];
var c = a;
a === a; // true
a === b; // false
a === c; // true
您应该通过循环检查数组内容:
function Palindrome(str) {
var myArray = str.split("");
for(var i = 0; i < myArray.length; i++) {
if(myArray[i] === " ") {
myArray.splice(i, 1);
}
}
var firstHalf = myArray.slice(0, Math.floor(myArray.length/2));
var secHalf = myArray.slice(Math.ceil(myArray.length/2));
secHalf.reverse();
for (var i = 0; i < firstHalf.length; i++){
if (firstHalf[i] != secHalf[i]) return false;
}
return true;
}
答案 1 :(得分:0)
您正在将两个数组直接与===
进行比较。那不会奏效。首先将它们加入字符串:
var myArray = str.split("");
for(var i = 0; i < myArray.length; i++) {
if(myArray[i] === " ") {
myArray.splice(i, 1);
}
}
var firstHalf = myArray.slice(0, Math.floor(myArray.length/2));
var secHalf = myArray.slice(Math.ceil(myArray.length/2));
secHalf.reverse();
// join them like this
firstHalf = firstHalf.join('');
secHalf = secHalf.join('');
return firstHalf === secHalf;
如果您想要更短/更简单/更快的方法,请尝试:
function Palindrome(str) {
str = str.replace(/ /g, '');
return str == str.split('').reverse().join('');
}