iT邦幫忙

2023 iThome 鐵人賽

DAY 17
0

CodeWars 題目

Link

難度

5 kyu

題目

參數 bonus 為獎金,price 是一罐啤酒的價格。
用啤酒搭金字塔,最上層 1 罐、第二層 4 罐、第三層 9 罐,依此類推。
計算所能買到的啤酒可以搭的金字塔層數。

思路

啤酒金字塔是序列數字的平方;
也就是 1^2+2^2+3^2+4^2 ….總和加起來,要小於等於能買的啤酒數量。
因此只要在限制之內,跑不確定迴圈次數 while,最後累計出的即是金字塔的層數。

pseudo code

start = 0
while loop
bonus - Math.pow(start,2) * price
return start

實作

var beeramid = function (bonus, price) {
   if (price > bonus) return 0;
   let start = 0;
   while (bonus >= Math.pow(start + 1, 2) * price) {
      start++;
      bonus = bonus - Math.pow(start, 2) * price;
   }
   return start;
}

while 迴圈 () 帶入的,是讓迴圈繼續進行的條件;同時也是停止條件。
因此 bonus 還能扣除該階層所需的啤酒就進入循環;否則當 bonus 不夠扣除時則跳出。

從 0 開始,先 start ++ 之後,再扣除每階層所需數量。
是為了讓 start 保留的是正確結果,確保每一次的循環,bonus 已經拿去買了啤酒,並且拼湊出金字塔的一層。

心得

其實一開始構想是用 + 的方式去累計金額,比對不超過 bonus 時,反而一直出各種問題。
突然轉彎想說那乾脆用扣除的呢?扣除反而簡單很多,最佳解也是類似概念。

不過我很常出現一開始的構思跟虛擬碼,和實作天差地遠的狀況。
思考方式還在建立中的感覺~


上一篇
Josephus Survivor
下一篇
Strip Comments
系列文
解三十天的 CodeWars30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言