2017-06-16 98 views
1

我遇到迴文功能問題。 這是我的函數:使用FOR循環的迴文功能

function palindrome(str) { 

    var newStr= str.replace(/[^0-9a-z]/gi, '').toLowerCase().split(""); 

    for(var i=0; i < (newStr.length)/2; i++){ 
    if(newStr[i] == newStr[newStr.length-i-1]){ 
     return true; 
    } else 
     return false; 
    } 

} palindrome("almostomla"); 

它的每一個字順利,除了與這一個「almostomla」和其他類似的,例如:「amariorama」,這是不正確。爲什麼會發生?

+1

檢查'palinidrome( 「淺綠色」)'。你的代碼只比較第一個和最後一個字符。它返回太早。 – Thomas

+1

另外,我想,'almostomla'和'amariorama'實際上並不是一個迴文。 –

回答

0

迴文是一個單詞,短語,數字或其他字符序列,它們與後向讀取相同,如夫人或賽車。如果允許調整大寫字母,標點符號和分詞,例如「一個男人,一個計劃,一條運河,巴拿馬!」,「我看到的是一輛汽車還是一隻貓」,那麼可以寫出句子長度的迴文。 「或尼克松「否」x「。

在上面的代碼中,你只是檢查字符串的第一個和最後一個字符,你需要檢查整個字符串。

function palindrome(str) { 

    var newStr= str.replace(/[^0-9a-z]/gi, '').toLowerCase().split(""); 

    for(var i=0; i < (newStr.length)/2; i++){ 
    if(newStr[i] !== newStr[newStr.length-i-1]){ 
     return false; 
    } 
    } 
return true; 
} 

這將是正確的代碼。

1

您的代碼失敗,因爲您在循環的第一次迭代中返回。您應該只在最後退回 - 或者如果檢查失敗,您可以立即返回。

function palindrome(str) { 

    var newStr= str.replace(/[^0-9a-z]/gi, '').toLowerCase().split(""); 

    for(var i=0; i < (newStr.length)/2; i++){ 
    if(newStr[i] == newStr[newStr.length-i-1]){ 
     //return true; 
    } else 
     return false; 
    } 
    return true; 
} 

這可重構刪除else

function palindrome(str) { 

    var newStr= str.replace(/[^0-9a-z]/gi, '').toLowerCase().split(""); 

    for(var i=0; i < (newStr.length)/2; i++){ 
    if(newStr[i] !== newStr[newStr.length-i-1]){ 
     return false; 
    } 
    } 
    return true; 
} 
+0

是的,現在我看到了問題。非常感謝你的隊友 –

1

首先,你正在使用一個循環,這被只是檢查數組,只有第一和最後一個元素之後執行的內部return語句所有的那麼函數返回false的錯誤,這是錯誤的。

此外,請注意:almostomla和amariorama不pallindrome 它容易檢查使用pallindrome reverse()方法如下:

function palindrome(s) { 
     var reverseString = s.split("").reverse().join(""); 
     if(s==reverseString) 
      console.log("palindrome"); 
     else 
      console.log("not palindrome"); 
    } 
    palindrome("almostomla"); 
+0

這是一個很好的解決方案+1 – mhatch