2016-03-30 16 views
1

これはコードです "eye"、 "race car"、 "palindrome"、 "man、plan、canalパナマ "、"決して奇妙ではない "... しかし、入力が" almostomla "であれば" true "を返します。誰かが理由を説明できますか?javascriptでpalindrome関数に問題があります

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

「奇妙なことに、あるいは偶数」は回文ではありません! –

+0

申し訳ありませんが、スペルミスです。入力は「決して奇妙ではない」 – sallysway

+0

ハハ、大丈夫です!!!! –

答えて

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

期待通りd。

古いコードはなぜ機能しませんか?

最初の正しいものだけをチェックし、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"));

+0

なぜか 'return newStr == newStr.split( '')。逆()。join( '');'? – AKS

+0

@AKSこれは私の最初のものです。 –

0

あなたは単語が回文であるかどうかを確認するためにシンプルな機能を利用することができる。

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

checkPalindrom("almostomla"); // false 
+1

これは、スペースやコンマ表示のものでは機能しません。 –

+1

はい、私はそのように書くことができたことを知っています。ありがとうございました!私は、しかし、私の以前のバージョンが動作していない理由を知りたいです:) – sallysway

+0

私はそれが比較する前にそれを世話をするだろうと仮定することができると思う。 @Carlosが提供したのは、OPが機能することができるアイデアです。 – AKS

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

あなただけの最初のエントリを比較した後戻ってきている。

for(y = 0; y < arr.length; y++){ 
    if(arr[y] == arr2[y]){ 
     return true; // here you are returning 
    } 
    else{ 
     return false; 
    } 
    } 

したがって、almostomlaの場合、とarr2の最初の要素は、aで始まり、終わるため、aです。

var flag = true; 

    for(y = 0; y < arr.length; y++){ 
    if(arr[y] != arr2[y]){ 
     flag= false; 
     break; 
    } 
    } 

return flag; 
1

をあなたが唯一のループのためにあなたの最後の最初と最後の文字をチェックしている:

あなたが一致していない最初のエントリをチェックするために、このようにそれを行うことができます。

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. 
+0

はい、あなたは正しいです。私のエラーを指摘してくれてありがとう。乾杯:) – sallysway

0

最初の文字と最後の文字を比較します。それらが同じ場合、コードは文字列内の他の文字をチェックせずに "True"を返します。ループの最初の反復で "True"が返されても、比較は継続する必要があります。

関連する問題