什么';使用Javascript评估字符串是否为回文的最有效方法是什么?

什么';使用Javascript评估字符串是否为回文的最有效方法是什么?,javascript,Javascript,我是Javascript新手,编写了下面的代码来确定字符串是否是回文。我很好奇,完成同样的任务最有效的方法是什么 var isPalindrome = function (string) { var leftString = []; var rightString = []; // Remove spaces in the string and convert to an array var strArray = string.split(" ").join("

我是Javascript新手,编写了下面的代码来确定字符串是否是回文。我很好奇,完成同样的任务最有效的方法是什么

var isPalindrome = function (string) {
    var leftString = [];
    var rightString = [];

    // Remove spaces in the string and convert to an array
    var strArray = string.split(" ").join("").split("");    
    var strLength = strArray.length;

    // Determine if the string is even or odd in length, then assign left and right strings accordingly
    if (strLength % 2 !== 0) {
        leftString = strArray.slice(0, (Math.round(strLength / 2) - 1));
        rightString = strArray.slice(Math.round(strLength / 2), strLength);
    } else {
        leftString = strArray.slice(0, (strLength / 2));
        rightString = strArray.slice((strLength / 2, strLength))
    }

    if (leftString.join("") === rightString.reverse().join("")) {
        alert(string + " is a palindrome.");
    } else {
        alert(string + " is not a palindrome.")
    }

}


isPalindrome("nurses run");

我认为这一点要简单得多:

var isPalindrome = function (string) {
    if (string == string.split('').reverse().join('')) {
        alert(string + ' is palindrome.');
    }
    else {
        alert(string + ' is not palindrome.');
    }
}
请参阅更多信息:

函数isAlindrome
{
变量i=0,j=s.length-1;
而(i.toLowerCase())返回false;
返回true;
}

为了提高效率,您应该避免不必要的计算。问问自己:

  • 是否需要删除空格
  • 是否需要转换为数组
  • 是否需要为左字符串和右字符串分配新对象
  • 你需要把绳子倒过来吗
检查可以在一个非常简单的循环中完成:

var len=string.length;
for (int i=0; i<(len/2); i++) {
  if (string[i] != string[len-i-1]) {
    alert(string + " is not a palindrome.");
    return;
  }
}
alert(string + " is a palindrome.");
var len=string.length;
对于(int i=0;i='a')&&&(c='a')&&(c='0')&&(c
var str=“abcba”;
var len=str.lengh;
var指数=0;

虽然(index不清楚您是否在谈论代码长度或计算量方面的效率,但这两方面都应该相当好。它考虑了空格旁边的非字母字符以及大小写:

function isPalindrome(str) {
   var i, len;

   str = str.toLowerCase().replace(/[^a-z]/g, '');
   len = str.length;

   for(i = 0; i < len / 2; i += 1) {
      if(str.charCodeAt(i) != str.charCodeAt(len - i - 1)) {
         return false;
      }
   }

   return true;
}
如果你真的想要警报,我建议把它放在一个单独的函数中:

function isPalindromeAlert(str) {
  alert(str + "is " + (isPalindrome(str) ? "" : "not ") + "a palindrome.");
}

不可读+不可维护+简洁+高效+递归+非分支

function isPalindrome(s,i) {
 return (i=i||0)<0|| i>=s.length/2|| s[i]==s[s.length-1-i]&& isPalindrome(s,++i);
}
函数isAlindrome(s,i){
返回(i=i | | 0)=s.length/2 | | s[i]==s[s.length-1-i]&&isPalindrome(s,++i);
}

Fiddle:

Firebug有javascript评测工具。尝试几种不同的方法,看看您的性能如何。如果您关心性能,请搜索“jsperf palindrome”,它会给您类似这样的信息(听起来像是家庭作业。)我不认为拆分、反转和联接是有效的。这到底是如何工作的?我不明白拆分、反转和联接在这里是如何工作的。除非你对输入做出不明显的假设……这也总是会返回true,if语句从不将字符串与任何东西进行比较,它只是检查y您可以反转字符串,它不应该是
string===string.split(“”).reverse().join(“”)
?@asku拆分和合并的意义是什么?你不能将其反转并进行比较吗?通常情况下,回文检查应该忽略空格和其他非字母字符。@jlRise如果在循环中跳过这些字符,而不是创建整个中间对象,可能会更有效……例如,如果字符串是
>a-------b
,然后在处理原始字符串中的所有
10
字符后创建一个新字符串
ab
。只有这样才能检查回文性(这是一个单词吗?)完成。这和其他一些答案将在第一次检查时看到
'a'!='b'
,因此会立即返回。好的,但我希望您喜欢编写代码(并确保它没有任何bug)。通常情况下,可读的代码比经过微优化的过度编译的代码更可取。@JLRishe OP要求的是最有效的方式,而不是最可读的方式。我非常喜欢编写这种代码!
function isPalindrome(str) {
   var i, len;

   str = str.toLowerCase().replace(/[^a-z]/g, '');
   len = str.length;

   for(i = 0; i < len / 2; i += 1) {
      if(str.charCodeAt(i) != str.charCodeAt(len - i - 1)) {
         return false;
      }
   }

   return true;
}
function isPalindrome(str) {
   str = str.toLowerCase().replace(/[^a-z]/g, '');

   return str == str.split("").reverse().join("");
}
function isPalindromeAlert(str) {
  alert(str + "is " + (isPalindrome(str) ? "" : "not ") + "a palindrome.");
}
function isPalindrome(s,i) {
 return (i=i||0)<0|| i>=s.length/2|| s[i]==s[s.length-1-i]&& isPalindrome(s,++i);
}