Salman Oskooi
Salman Oskooi

Reputation: 366

Palindrome challenge on Coderbyte

I can't figure out why the following code does not work for the Coderbyte challenge where you have to test a string to see if it is a palindrome (the characters being the same when read in reverse as they are normally). I know there are better ways to write the code for the same result, but I still think this way should work (assuming no capital letters or non-alphabetic characters in the input string). But testing it doesn't yield the results I need. Here it is:

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; 
}

What I'm trying to do is split up the input string into an array, remove the spaces, specify the first and second halves of that array, reverse the second half, then compare if the two halves are equal. In cases where the number of characters in the string str is odd the middle character isn't taken into account since it shouldn't matter. And I did try asking this on Coderbyte but my question was not posted for some reason.

Upvotes: 1

Views: 7956

Answers (2)

user428517
user428517

Reputation: 4193

You are comparing two arrays directly with ===. That won't work. First join them into strings:

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;

If you want shorter/simpler/faster way to do this, try:

function Palindrome(str) {
    str = str.replace(/ /g, '');
    return str == str.split('').reverse().join('');
}

Upvotes: 0

arcyqwerty
arcyqwerty

Reputation: 10695

You can't do the array comparison using === since that checks if the object references are equal (the variable refers to the same array).

For example:

var a = [1, 2, 3];
var b = [1, 2, 3];
var c = a;
a === a; // true
a === b; // false
a === c; // true

You should check through the array contents by looping:

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; 
}

Upvotes: 1

Related Questions