带 FOR 循环的回文函数



我在回文函数方面遇到了问题。这是我的功能:

function palindrome(str) {
  var newStr= str.replace(/[^0-9a-z]/gi, '').toLowerCase().split("");
  for(var i=0; i < (newStr.length)/2; i++){ 
    if(newStr[i] == newStr[newStr.length-i-1]){ 
      return true; 
    } else 
      return false; 
  }
} palindrome("almostomla");

它与每个单词都很好,除了这个"almostomla"和其他类似的单词,例如:"amariorama",这是不正确的。为什么会这样?

首先,你在循环中使用 return 语句,该语句在仅检查数组的第一个和最后一个元素后执行,然后函数返回 true of false,这是错误的。

另外,注意:Almostomla和amariorama不是回文使用 reverse(( 方法很容易检查回文,如下所示:

    function palindrome(s) {
       var reverseString = s.split("").reverse().join("");
       if(s==reverseString)
          console.log("palindrome");
       else
          console.log("not palindrome");
    }
    palindrome("almostomla");

您的代码失败,因为您在循环的第一次迭代时返回。您应该只在最后返回 - 或者如果检查失败,您可以立即返回。

function palindrome(str) {
  var newStr= str.replace(/[^0-9a-z]/gi, '').toLowerCase().split("");
  for(var i=0; i < (newStr.length)/2; i++){ 
    if(newStr[i] == newStr[newStr.length-i-1]){ 
      //return true;
    } else 
      return false; 
  }
  return true;
}

可以对其进行重构以删除else

function palindrome(str) {
  var newStr= str.replace(/[^0-9a-z]/gi, '').toLowerCase().split("");
  for(var i=0; i < (newStr.length)/2; i++){ 
    if(newStr[i] !== newStr[newStr.length-i-1]){ 
      return false;
    } 
  }
  return true;
}

回文是一个单词、短语、数字或其他字符序列,其向后和向前读法相同,例如女士或赛车。当允许调整大写字母、标点符号和分词时,可以写句子长度的回文,例如"一个人,一个计划,一条运河,巴拿马!","我看到的是汽车还是猫?"或"尼克松没有'x'"。

在上面的代码中,您只检查字符串的第一个和最后一个字符,您需要检查整个字符串。

function palindrome(str) {
  var newStr= str.replace(/[^0-9a-z]/gi, '').toLowerCase().split("");
  for(var i=0; i < (newStr.length)/2; i++){ 
    if(newStr[i] !== newStr[newStr.length-i-1]){ 
      return false; 
    }  
  }
 return true;
}

这将是正确的代码。

最新更新