Coderbyte 上的回文挑战
Palindrome challenge on Coderbyte
我不明白为什么以下代码不适用于 Coderbyte 挑战,在 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 上提出这个问题,但由于某种原因我的问题没有发布。
您不能使用 ===
进行数组比较,因为它会检查对象引用是否相等(变量引用同一个数组)。
例如:
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;
}
您正在使用 ===
直接比较两个数组。那行不通的。首先将它们连接成字符串:
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;
如果您想要shorter/simpler/faster方法来做到这一点,请尝试:
function Palindrome(str) {
str = str.replace(/ /g, '');
return str == str.split('').reverse().join('');
}
我不明白为什么以下代码不适用于 Coderbyte 挑战,在 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 上提出这个问题,但由于某种原因我的问题没有发布。
您不能使用 ===
进行数组比较,因为它会检查对象引用是否相等(变量引用同一个数组)。
例如:
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;
}
您正在使用 ===
直接比较两个数组。那行不通的。首先将它们连接成字符串:
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;
如果您想要shorter/simpler/faster方法来做到这一点,请尝试:
function Palindrome(str) {
str = str.replace(/ /g, '');
return str == str.split('').reverse().join('');
}