我在javascript中遇到了一个回文函数的问题

I am having trouble with a palindrome function in javascript

本文关键字:一个 回文 函数 问题 javascript 遇到 我在      更新时间:2023-09-28

这是我的代码:该函数适用于输入:"眼睛"、"赛车"、"不是回文"、"一个人、一个计划、一条运河。巴拿马"、"从不奇怪或偶数"。。。然而,当输入为"almostola"时,它会返回"true"。有人能解释一下原因吗?

function palindrome(str) {
  var newStr = str.replace(/[^0-9a-zA-Z]/g, '');
  newStr = newStr.replace(/'s+/g, '');
  newStr = newStr.toLowerCase();
  var arr = newStr.split('');
  var arr2 =[];
  for(x = 0; x < arr.length; x++){
    arr2.push(arr[arr.length-1-x]);
  }
  for(y = 0; y < arr.length; y++){
    if(arr[y] == arr2[y]){
      return true;
    }
    else{
      return false;
    }
  }
}
palindrome("almostomla");

您只检查最后一个for循环中的第一个和最后一个字符。

for(y = 0; y < arr.length; y++){
    if(arr[y] == arr2[y]){ //if first and last chars equal you are returning true.
      return true;
    }
    else{
      return false;
    }
}

您应该检查所有字符,直到出现差异或结束。

for(y = 0; y < arr.length; y++){
    if(arr[y] != arr2[y]){
      return false;
    }
}
return true; --that means two arrays are same.

在去除噪声后,我真的会替换下面这样的回文检查函数:

function palindrome(str) {
  var newStr = str.replace(/[^0-9a-zA-Z]/g, '');
  newStr = newStr.replace(/'s+/g, '');
  newStr = newStr.toLowerCase();
  var arr = newStr.split('');
  return arr.join('') == arr.reverse().join('');
}
alert(palindrome("almostomla"));
alert(palindrome("never odd or even"));

工作符合预期。

为什么您的旧代码不起作用

它只检查第一个正确的东西并返回true。您应该从中删除return true。只要第一个和最后一个字符相同,您的代码就是,就将其视为回文

所以你的代码,更正后的形式将是:

function palindrome(str) {
  var newStr = str.replace(/[^0-9a-zA-Z]/g, '');
  newStr = newStr.replace(/'s+/g, '');
  newStr = newStr.toLowerCase();
  var arr = newStr.split('');
  var arr2 = [];
  for (var x = 0; x < arr.length; x++) {
    arr2.push(arr[arr.length - 1 - x]);
  }
  for (var y = 0; y < arr.length; y++) {
    debugger;
    if (arr[y] != arr2[y]) {
      return false;
    }
  }
  return true; // Place it here to return after the whole loop.
}
alert(palindrome("almostomla"));
alert(palindrome("never odd or even"));

为什么不简单地这样做:

function palindrome(str) {
  var isPalindrome = true;
  var newStr = str.replace(/[^0-9a-zA-Z]/g, '');
  newStr = newStr.replace(/'s+/g, '');
  newStr = newStr.toLowerCase();
  var arr = newStr.split('');
  for(x = 0; x < arr.length / 2; x++) {
      if(arr[x] != arr[arr.length - 1 - x])
      {
          isPalindrome = false;
          break;
      }
  }    
  return isPalindrome;
}

您在比较第一个条目后返回:

for(y = 0; y < arr.length; y++){
    if(arr[y] == arr2[y]){
      return true; // here you are returning
    }
    else{
      return false;
    }
  }

因此,在almostomla的情况下,arrarr2的第一个元素都是a,因为字符串以a开始和结束。

你可以这样做来检查第一个不匹配的条目:

var flag = true;
  for(y = 0; y < arr.length; y++){
    if(arr[y] != arr2[y]){
      flag= false;
      break;
    }
  }
return flag;

比较第一个字母和最后一个字母。如果它们相同,则代码返回"True",而不检查字符串中的其他字母。即使循环的第一次迭代产生"True",比较也应该继续!

您可以使用一个更简单的函数来检查单词是否为回文:

function checkPalindrom(str) {
    return str == str.split('').reverse().join('');
}
checkPalindrom("almostomla"); // false