【问题标题】:Palindrome function in JavaScript [duplicate]JavaScript中的回文函数[重复]
【发布时间】:2017-01-15 15:57:37
【问题描述】:

我需要有关此回文分配的帮助(无论空格、符号和标点符号如何,对于从后面读取的相同单词都应显示为 true)。我在这里没有看到问题,但它无法正常工作。问题就像正则表达式不正确,但我在 regexr 上测试了正则表达式,它应该可以。

有人知道问题出在哪里吗?

提前致谢。

function palindrome(str) {

  var pal = str;

  pal.replace(/[\W_]/g, "");
  pal.toLowerCase();

  var arr = pal.split("");
  arr.reverse();
  var pal2 = arr.join("");

  if(pal2 === pal){
    return true;
  }
  else{
    return false;
  }

}


//this should show true but its false
palindrome("_eye");

【问题讨论】:

  • replacetoLowerCase 都不会就地修改它们的参数:它们会返回结果。
  • var pal = str.replace(/[\W_]/g, "").toLowerCase(); 是的,这行得通。谢谢!
  • (str = str.replace(/[\W_]/g, "")) === str.split('').reverse().join('')

标签: javascript regex palindrome


【解决方案1】:

就像我在评论中所说,您的代码不起作用,因为它假定 replace()toLowerCase() 都增加了他们的论点。但他们没有,他们返回一个新字符串,而不是修改给定的字符串。因此,在您的示例中,_ 符号仍然存在于比较例程中,从而弄乱了预期的结果。

另一个旁注:当你基于某个比较操作的函数结果时,没有必要使用if。您可以随时替换它:

if (a === b) {
  return true;
}
else {
  return false;
}

...简单:

return a === b;

一般来说任务:虽然 split-reverse-join-compare 是最简单的方法(查看@adeneo 的评论以获得不错的单线),但它并不是最佳的。想一想:你只需要比较字符串的一半。有一种方法可以做到:

function isDirectPalindrome(str) {
  var i = 0, j = str.length - 1;
  while (i < j) {
    if (str.charAt(i++) !== str.charAt(j--)) {
      return false;
    }
  }
  return true;
}

function isPalindrome(str) {
  return isDirectPalindrome(str.replace(/[\W_]+/g, '').toLowerCase());
}

这里有两个函数:第一个总是检查字符串是否是回文原样(这里没有“噪音”符号),第二个预先对字符串进行规范化。这使得在需要时重用第一个变得更加简单。

当然,这只是一个测试。但我认为在这里展示算法和模块化点是方便且有用的。

【讨论】:

  • 感谢您的意见,我会确保了解其他方法。
猜你喜欢
  • 2020-10-04
  • 2013-10-23
  • 1970-01-01
  • 2012-10-11
  • 1970-01-01
  • 2015-03-15
  • 2012-08-14
  • 2014-03-05
  • 2011-08-19
相关资源
最近更新 更多