2017-05-14 65 views
0

我寫一個字符串比較函數,其中結果如下任務:
串字符迭代Efficency在JavaScript

"ABC" & "abc" returns 0; 
"abc" & "abcd" return -1; 
"abcd" & "abc" returns 1; 

我的解決辦法是:

function strcmp(a,b){ 
    var aTemp = a.toLowerCase(); 
    var bTemp = b.toLowerCase(); 
    if(aTemp === bTemp){ 
    return 0; 
    } else { 
    for(var i = 0; i < aTemp.length;i++){ 
     var charAtA = aTemp.charCodeAt(i), charAtB = bTemp.charCodeAt(i); 
     if(charAtB !== charAtB) // NaN returns false when compared to itself. 
     return 1; 
     if(charAtA < charAtB) 
       return -1; 
     else if(charAtA > charAtB) 
     return 1; 
    } 
    if(bTemp.length > aTemp.length) 
     return -1; 
    return 0; 
    } 
} 

當呈現我的解決方案(除了在代碼中發現bug之外),我被問到爲什麼我將字符串轉換爲小寫字母並將它們存儲在參數中,而不是for循環的每次迭代中,將字符轉換爲小寫。 所以我的問題是,將字符串轉換爲小寫字母,更有效率,還是我提交答案只是與我一起玩智力遊戲的人的正確方法是什麼?

+0

'「abc」&「abd」'的輸出是什麼? – Kroltan

+0

似乎過於複雜? - > ** https://jsfiddle.net/adeneo/1w7kudsj/** – adeneo

+0

@adeneo你的小提琴爲'strcmp(「fooABC」,「oabc」)返回1# – Barmar

回答

1

轉換整個字符串轉換爲小寫意味着你必須遍歷所有的字符,即使比較將在第一個字符差異停止。因此,如果您按照每個字符進行轉換,則只需執行儘可能多的轉換即可獲得結果。除非這兩個字符串是平等的,否則您總是會以這種方式進行較少的轉換;當他們平等時,您可以進行相同數量的轉化。

+0

謝謝你回答這個問題。 –

0

作爲對您的問題的回答,您將小寫字符串保存到變量中是正確的。如果你在for循環內部進行了轉換,那麼在每次迭代時,toLowerCase()方法就會被調用,這是低效的。

現在,不知道您是否知道,但JavaScript有一個類似於strcmp的方法,名爲localeCompare()。所以,你的代碼的替代將是這樣:

a.toLowerCase().localeCompare(b.toLowerCase());