调试回文函数 JavaScript

Debugging JavaScript for Palindrome Function

function palindrome(str) {
  str = str.replace(' ', '');
  str = str.replace(',', '');
  str = str.replace('.', '');
  str = str.toLowerCase();
  if (str.length % 2 === 0) {
    var x = 0;
    while (x < (str.length - x)) {
        if (str.charAt(x) === str.charAt((str.length - x) - 1)) {
          x++;
        } else {
          return false;
        }
   }
   return true; 
  } else {
    var y = 0;
    while (y < (str.length - y - 1)) {
      if (str.charAt(y) === str.charAt((str.length - y) - 1)) {
          y++;
        } else {
          return false;
        }
   }
   return true;
   }
}

palindrome("eye");

这可能不是解决此问题的最有效方法,但我首先删除无关字符,然后使用 if/else 拆分偶数和奇数字符串长度。在每一个中,我只检查单词中间的字符是否相等 - 因为过去会重复。

然而,经过多次更改并研究了问题的其他解决方案后,我仍然无法通过特定案例:palindrome("never odd or even")

如果有帮助,它会通过 "race car""almostomla" 以及 "eye"

提前致谢!

问题是因为以下几行:

str = str.replace(' ', '');
str = str.replace(',', '');
str = str.replace('.', '');

它确实会在全局范围内替换所有白色 space、逗号或点,如果存在的话,它只会替换一个 space、逗号和点。您必须找到所有 space、逗号和点并将它们删除。这就是你能做的,

str = str.replace(/ /g, '');
str = str.replace(/,/g, '');
str = str.replace(/./g, '');

g字符表示重复搜索整个字符串。阅读此内容以及 JavaScript here.

中可用的其他 RegEx 修饰符

已编辑:

你可以这样做:

if(str.replace(/ /g, '').length != 0){
    str = str.replace(/ /g, '');
}
if(str.replace(/,/g, '').length != 0){
    str = str.replace(/,/g, '');
}
if(str.replace(/\./g, '').length != 0){
    str = str.replace(/\./g, '');
}

除非您想编写自己的代码,否则为什么不使用用户 reverse/join?

function palindrome(str) 
{
  str = str.split(' ').join('');
  str = str.split(',').join('');
  str = str.split('.').join('');
  str = str.toLowerCase();
  if (str.split('').reverse().join('') == str)
  {
    return true;
  }
  else
  {
    return false;
  }

}

palindrome("never odd or even");

问题在于本机 replace Javascript 函数仅替换字符串中的单个事件。使用 Regex 计算字符串中的所有匹配项。

但是,请记住“.”字符在 Regex 中用作通配符,因此您需要使用反斜杠将其转义以告诉 Regex 您正在专门寻找“。”特点。以这个 JSFiddle 为例:https://jsfiddle.net/on333yf9/3/

function palindrome(str) {
  str = str.replace(/ /g, '');
  str = str.replace(/,/g, '');
  str = str.replace(/\./g, '');
  str = str.toLowerCase();
  if (str.length % 2 === 0) {
    var x = 0;
    while (x < (str.length - x)) {
        if (str.charAt(x) === str.charAt((str.length - x) - 1)) {
          x++;
        } else {
          return false;
        }
   }
   return true; 
  } else {
    var y = 0;
    while (y < (str.length - y - 1)) {
      if (str.charAt(y) === str.charAt((str.length - y) - 1)) {
          y++;
        } else {
          return false;
        }
   }
   return true;
   }
}