提问者:小点点

回文函数在单词不是回文时返回true


有人能告诉我为什么“almostomla”在我的代码中返回true。

我已经搜索并看到有更简单的版本,但是我现在对这段代码如此深入,如果可能的话,我需要让它工作。请原谅可怕的变量名,我很沮丧。

function palindrome(str) {
  str = str.toLowerCase();
  str = str.replace(/ /g, '').replace(/\./g, '').replace(/,/g, '');

  for (var i = 0; i < str.length / 2; i++) {
    for (var j = str.length - 1; j > str.length / 2 - 1; j--) {
      var iDntKnow = str.charAt(i);
      var iDntKnowEither = str.charAt(j);
      if (iDntKnow === iDntKnowEither) {
        return true;
      } else {
        return false;
      }
    }
  }
}

感谢所有的答案。


共3个答案

匿名用户

虽然我能理解如果你投入了时间,想要让某件事发挥作用的挫败感,但从绘图板开始,不要让自己发疯,也有一些话要说。我看到你的代码的主要问题是,当你只需要一个循环时,你有两个循环。第二个循环实际上是在破坏你。我建议运行一个调试器(在你的代码中输入“调试器”并运行),看看为什么。

我相信这就是你正在努力实现的目标:

var palindrome = function(str) {

  // Put any additional string preprocessing here.

  for(var i = 0; i < str.length/2; i++) {
    var j = str.length-i-1;

    if (str[i] != str[j]) {
      return false;
    }
  }

  return true;
}

通过这种方式,您可以比较字符串中的每个镜像元素以确认字符串是否是回文。

匿名用户

你的问题现在似乎得到了回答。

如果性能不是问题,为什么不直接使用它呢?

function palindrome(str) {
  str = str.toLowerCase();
  return (str.split().reverse().join() === str)
}

它将字符串拆分为一个数组,反转并将其重新连接在一起。结果与原始字符串进行比较。

匿名用户

你只能知道它在每次迭代中是否不是回文。

另外,为什么要使用嵌套循环?

function palindrome(str) {
  str = str.toLowerCase();
  str = str.replace(/ /g, '').replace(/\./g, '').replace(/,/g, '');

  for (var i = 0; i < str.length / 2; i++) {
      if (str.charAt(i) !== str.charAt(str.length - i - 1)) {
        return false;
      }
  }
  return true;
}