首頁 > web前端 > js教程 > 主體

JavaScript趣題:減肥俱樂部

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

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

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

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

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

比如說,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中文網(www.php.cn)!

🎜🎜
相關標籤:
來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
最新問題
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板