如何比较Palindromes

时间:2017-04-23 15:15:06

标签: javascript arrays palindrome

不确定我做错了什么。我想比较2个字符串,看看它们是否是Palindromes

function palindrome(str) {
  var rem = str.replace(/\s/g, "");
  var a = rem.split("");
  var b = a.reverse();

  for(var i = 0; i < rem.length; i++){
    if (b[i] == a[i]){
      return true;
    }
      return false;
  }
}

palindrome("not a doctor"); //this should show false, but it's showing true

4 个答案:

答案 0 :(得分:2)

  

reverse方法将调用数组对象的元素转换到位,改变数组,并返回对数组的引用。

Source

这就是你得到true的原因。似乎您的ab变量指向同一个对象。

顺便说一下,你的方法似乎有些有缺陷,正如其他人指出的那样。因此,对您的任务的更好的解决方案版本可能(未经过适当测试):

function isPalindrome(input) {
  var str = input.replace(/\s/g, "").toLowerCase();
  var left = 0, right = str.length - 1;
    while( left <= right) {
      if(str[left] !== str[right]) return false;
      left++; right--;
    }
  return true;
}

  console.log(isPalindrome("your string")); // false
  console.log(isPalindrome("Drawn onward")); //true

这个想法是你比较你修改过的(没有空格和小写)字符串两端的相应符号。如果它们在某些时候不匹配,那么这不是回文。

答案 1 :(得分:0)

您的代码有两个问题。

如@curveball所述,你的a和b变量是对相同对象的引用,因为reverse修改了原始数组。

此外,只要a数组中的第一个元素等于b数组的第一个元素,就会返回true。只要一个元素与另一个元素不同,就必须返回false。但只有在比较 all 数组中的元素后才能返回true。

function palindrome(str) {
  var rem = str.replace(/\s/g, "");
  var a = rem.split("");
  var b = a.slice().reverse();

  for(var i = 0; i < rem.length; i++){
    if (b[i] !== a[i]){
      return false;
    }
  }
  return true;
}

palindrome("not a doctor");

此外,用于检查字符串是否为回文的替代(和典型)算法是比较(在删除空白之后)第一个位置到最后一个位置,第二个位置从结尾到第二个位置等等。这样就不是克隆(和反向)数据所必需的。

答案 2 :(得分:0)

正如其他人所说,您的ab指向同一个对象,因此您需要先克隆它。

此外,您不能立即返回true,更好的方法是检查不等式并在整个周期结束后返回true

function palindrome(str) {
  var rem = str.replace(/\s/g, "");
  var a = rem.split("");
  var b = a.slice().reverse();
  console.log(a, b);

  for(var i = 0; i < rem.length; i++){
    if (b[i] != a[i]){
      return false;
    }
  }

  return true;
}

console.log(palindrome("lol 1"));

答案 3 :(得分:0)

您的代码存在一些问题。

问题1:您正在使用reverse方法来改变原始数组(请参阅reverse上的文档)。因此变量a和b将具有相同的值,即原始数组的反向字符串。您可以做的是创建一个全新的数组并将其分配给变量b,如下所示:

var b = [].concat(a).reverse();

问题2:您忘记检查字符串中的所有字母。你太早回归你的功能。例如,对于输入字符串'aada',它不是回文,它将返回true。这是因为,只要评估两个数组的第一个字符串的相似性,就会退出函数。要解决此问题,您可以执行以下操作:

function palindrome(str) {
  var rem = str.replace(/\s/g, "");
  var a = rem.split("");
  var b = [].concat(a).reverse();

  for(var i = 0; i < rem.length; i++){
    if (b[i] !== a[i]){
      return false;
    }
  }
  return true
}

您甚至可以进一步优化您的功能:

function palindrome(str) {
 const len = str.length;
 const halfLen = len/2;
 for (let i = 0; i < halfLen; i++) {
   if (str[i] !== str[len - 1 - i]) return false;
 }
 return true;
}

Palindrome字符串向前和向后读取相同的内容,因此您可以比较第一个和最后一个,第二个到第二个等,直到您到达中间字符。

希望这有帮助。