iT邦幫忙

2023 iThome 鐵人賽

DAY 23
0
自我挑戰組

解三十天的 CodeWars系列 第 23

Weight for weight

  • 分享至 

  • xImage
  •  

CodeWars 題目

Link

難度

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 如果不是在過去解題中看到,還不曾知道有這樣的原生方法~


上一篇
Scramblies
下一篇
Number of trailing zeros of N!
系列文
解三十天的 CodeWars30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言