什么';使用Javascript评估字符串是否为回文的最有效方法是什么?
我是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("
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')&&(cvar 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);
}