我和朋友小王都是「減肥健身俱樂部」的成員。
小王最近總是憂心忡忡的樣子,因為每個月這幾天都會發布一個所有成員的體重名單,而他每次都無一例外是最胖的。
我也是擬定名單的一份子,於是我告訴他:「別擔心,我的朋友,我來幫你改下列表的順序」。
我前思後想,覺得還是按這樣的順序來排為好:每個體重數字,按各個數字數字之和,從小到大排列。
比如說,99kg,它的各個數字數字總和是18,也就是說「權重」為18。
再例如,100kg,它的權重是1,所以排在99kg之前。
任務是這樣:
給定減肥俱樂部成員名單字符串,你能按權重給它排序並返回嘛?
例子:
"56 65 74 100 99 68 86 180 90" => "100 180 90 56 65 74 68 86 99"
當兩個數字擁有同樣的權重,如180和90,則180在前,此時我們按照字典序來。
所有數字都為正,列表可能為空白。
說實話,看到這個題目,我也是有些汗~畢竟自己也是個胖子。
直接操作字串顯然不夠方便,還是打散成陣列吧!
接著對數組進行排序,規則如下:
1.權重優先,權重越小,排名越前。
2.當權重相同,再依照字典序排列。
計算權重,也就是計算各個數字數字之和,得需要這個方法:
function eachDigitSum(num){ var sum = 0; num = num - 0; while(num > 0){ sum += num % 10; num = parseInt(num / 10); } return sum; }
接著,比較字典序,需要這個方法:
function compareASCII(a,b){ var i=0; while(true){ var c1 = a.charCodeAt(i); var c2 = b.charCodeAt(i); if(!c1){ return -1; } if(!c2){ return 1; } if(c1 < c2){ return -1; } if(c1 > c2){ return 1; } i++; } }
其實這個方法在原生JS是有替代方法的:
String.prototype.localeCompare
其實這個方法在原生JS是有替代方法的:
function orderWeight(str) { return str.split(" ").sort(function(a,b){ var n1 = eachDigitSum(a); var n2 = eachDigitSum(b); if(n1 > n2){ return 1; } else if(n1 < n2){ return -1; } else{ return compareASCII(a,b); } }).join(" "); }
最後,整合下排序,再聚合成字串就可以了。
rrreee以上就是 JavaScript趣題:減肥俱樂部的內容,更多相關內容請關注PHP中文網(m.sbmmt.com)!