5 kyu
將十進位的數字,以字面上的加總之後,再以原樣從小到大排列。
例如 2000 與 99:2 + 0 + 0 + 0 = 2;9 + 9 = 18,排序:2000 ⇒ 99。
因為需要字面上的加總,以 split 將數字拆開。
同時在拆開的每一數字之中,繼續拆開迭代每一個數字字元。
加總之後再以排序比對大小。
function orderWeight(strng) {
let workArr = strng.split(" ").map(item => {
let weight = item.split("").reduce((sum,num)=>{
return sum += +num;
},0)
return [item, weight];
});
workArr.sort((a,b)=> {
if(a[1] === b[1]){
return a[0].localeCompare(b[0]);
}
return a[1]-b[1];
});
return workArr.map(item => item[0]).join(" ");
}
第一個 split 將傳入的字串,以空格為分界拆成 Array;第二個 split 將每一個數字差成每一個字元;reduce 將每一個數字加總,回傳成 weight。
最後紀錄的是表示原本字面數字的 item,也就是 99;weight 為加總的數字,也就是 18。
利用 sort 比對大小,但題目還有一個條件,如果 weight 數字一樣,以原有的字串順序排序。
也就是說要拿 99 來比較,而不是 18。
而 localecompare
是比較少用到的字串比較方法。
它與平常 sort 會使用的 a - b 同理,會回傳一個數字表示 a 及 b 誰先誰後。
最後將排序的結果轉為字串。
解越多題,越感受到經驗累積的差異在哪。localecompare
如果不是在過去解題中看到,還不曾知道有這樣的原生方法~