比标准答案快 25 倍
function isPalindrome(s,i) {
return (i=i||0)<0||i>=s.length>>1||s[i]==s[s.length-1-i]&&isPalindrome(s,++i);
}
使用像:
isPalindrome('racecar');
因为它定义了“我”本身
小提琴:http : //jsfiddle.net/namcx0yf/9/
这比下面的标准答案快约 25 倍。
function checkPalindrome(str) {
return str == str.split('').reverse().join('');
}
小提琴:http : //jsfiddle.net/t0zfjfab/2/
查看控制台以获取性能结果。
尽管该解决方案难以阅读和维护,但我建议您理解它,以通过递归和位移来展示非分支,从而给您的下一位面试官留下深刻印象。
解释
|| 和 && 用于像“if”“else”这样的控制流。如果有东西 || 是真的,它只是以真退出。如果某事是假的离开 || 它必须继续下去。如果 && 剩下的东西是假的,它作为假退出,如果 && 剩下的东西是真的,它必须继续。这被认为是“非分支”,因为它不需要 if-else 中断,而只是对其进行评估。
1.使用不需要将“i”定义为参数的初始化程序。如果已定义,则将“i”分配给自身,否则初始化为 0。Always 为假,因此始终评估下一个 OR 条件。
(i = i || 0) < 0
2.检查“i”是否走到一半但跳过检查中间的奇数字符。位移位在这里就像除以 2 但到最低的偶数邻居除以 2 结果。如果为真,则假定回文,因为它已经完成。如果 false 评估下一个 OR 条件。
i >= s.length >> 1
3.根据“i”从开始字符和结束字符进行比较,最终作为邻居或邻居遇到中间字符。如果 false 退出并假定 NOT 回文。如果 true 继续下一个 AND 条件。
s[i] == s[s.length-1-i]
4.再次调用自身进行递归,将原始字符串作为“s”传递。由于“i”在这一点上是确定定义的,因此它被预先增加以继续检查字符串的位置。返回指示是否回文的布尔值。
isPalindrome(s,++i)
但...
一个简单的 for 循环仍然比我想象中的答案快两倍(又名 KISS 原则)
function fastestIsPalindrome(str) {
var len = Math.floor(str.length / 2);
for (var i = 0; i < len; i++)
if (str[i] !== str[str.length - i - 1])
return false;
return true;
}
http://jsfiddle.net/6L953awz/1/