JavaScript趣題:減肥俱樂部

黄舟
發布: 2017-02-04 15:24:24
原創
1084 人瀏覽過

我和朋友小王都是「減肥健身俱樂部」的成員。

小王最近總是憂心忡忡的樣子,因為每個月這幾天都會發布一個所有成員的體重名單,而他每次都無一例外是最胖的。

我也是擬定名單的一份子,於是我告訴他:「別擔心,我的朋友,我來幫你改下列表的順序」。

我前思後想,覺得還是按這樣的順序來排為好:每個體重數字,按各個數字數字之和,從小到大排列。

比如說,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)!

相關標籤:
來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
最新問題
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板
關於我們 免責聲明 Sitemap
PHP中文網:公益線上PHP培訓,幫助PHP學習者快速成長!