Palderrome对Coderbyte的挑战

时间:2015-09-14 22:22:10

标签: javascript palindrome

我无法弄清楚为什么下面的代码不能用于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上问这个问题,但我的问题并没有因为某些原因而发布。

2 个答案:

答案 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('');
}