標準の回答より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');
「i」自体を定義するので
フィドル: http: //jsfiddle.net/namcx0yf/9/
これは、以下の標準的な回答よりも約25倍高速です。
function checkPalindrome(str) {
return str == str.split('').reverse().join('');
}
フィドル: http: //jsfiddle.net/t0zfjfab/2/
パフォーマンス結果については、コンソールを表示してください。
ソリューションを読んで維持するのは難しいですが、次のインタビュアーを感動させるために、再帰とビットシフトを伴う非分岐を示すためにそれを理解することをお勧めします。
説明
|| および&&は、「if」、「else」などの制御フローに使用されます。何かが残っている場合|| trueの場合、trueで終了します。||の左側に何かが間違っている場合 継続する必要があります。&&の左側にあるものがfalseの場合、falseとして終了します。&&の左側にあるものがtrueの場合、続行する必要があります。これは、if-elseの割り込みを必要とせず、評価されたばかりであるため、「非分岐」と見なされます。
1.引数として「i」を定義する必要のない初期化子を使用しました。定義されている場合はそれ自体に「i」を割り当て、そうでない場合は0に初期化します。常にfalseであるため、次のOR条件が常に評価されます。
(i = i || 0) < 0
2.「i」が途中まで進んだかどうかをチェックしますが、真ん中の奇数文字のチェックをスキップします。ここでビットシフトされたのは2による除算のようなものですが、結果として隣接する除算でさえ最低になります。trueの場合、すでに実行されているため、回文を想定します。falseの場合、次のOR条件を評価します。
i >= s.length >> 1
3.「i」に従って最初の文字と最後の文字を比較して、最終的には隣人または中間の文字の隣人として会います。falseが終了し、回文ではないと想定した場合。trueの場合、次のAND条件に進みます。
s[i] == s[s.length-1-i]
4.元の文字列を「s」として渡す再帰のために自分自身を再度呼び出します。この時点で「i」は確実に定義されているため、文字列の位置をチェックし続けるために事前にインクリメントされます。回文かどうかを示すブール値を返します。
isPalindrome(s,++i)
しかし...
単純なforループは、私の空想的な答えの約2倍の速さです(別名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/