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

时间:2016-03-30 11:47:18

标签: javascript palindrome

这是我的代码:    该功能适用​​于输入:"眼睛","赛车","不是回文","男人,计划,运河。巴拿马","从不奇怪甚至" ... 但是,它会返回" true"当输入是" almostomla"。有人可以解释一下原因吗?

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");

6 个答案:

答案 0 :(得分:1)

您只检查上一个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.

答案 1 :(得分:0)

您可以使用更简单的功能来检查单词是否是回文:

function checkPalindrom(str) {
    return str == str.split('').reverse().join('');
}

checkPalindrom("almostomla"); // false

答案 2 :(得分:0)

在消除噪音之后,我真的会更换下面的回文检查功能:

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"));

答案 3 :(得分:0)

为什么不简单地这样做:

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;
}

答案 4 :(得分:0)

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

List<ContentType> contentTypeCustom = new List<ContentType>();
foreach (ContentType ct in contentTypeColl)
if (ct.Group == "Tipos de contenido personalizados")
newList.ContentTypes.AddExistingContentType(ct);

newList.Update();
context.ExecuteQuery();

因此for(y = 0; y < arr.length; y++){ if(arr[y] == arr2[y]){ return true; // here you are returning } else{ return false; } } almostomlaarr的第一个元素都是arr2,因为字符串以a开头和结尾。

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

a

答案 5 :(得分:0)

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