iT邦幫忙

第 12 屆 iThome 鐵人賽

DAY 4
0

題目:
(6 級) Sums of Parts
讓我們研究以下示例 (以通用格式編寫的陣列):
ls = [0, 1, 3, 6, 10]
該陣列的各部分:

ls = [0, 1, 3, 6, 10]
ls = [1, 3, 6, 10]
ls = [3, 6, 10]
ls = [6, 10]
ls = [10]
ls = []

每一個部分所對應的總和為 (集中放在陣列中):[20, 20, 19, 16, 10, 0]

函式 parts_sums 接受 ls 作為參數並回傳 ls 每個部分的總和,如上方所示。

範例:

ls = [1, 2, 3, 4, 5, 6] 
parts_sums(ls) -> [21, 20, 18, 15, 11, 6, 0]

ls = [744125, 935, 407, 454, 430, 90, 144, 6710213, 889, 810, 2579358]
parts_sums(ls) -> [10037855, 9293730, 9292795, 9292388, 9291934, 9291504, 9291414, 9291270, 2581057, 2580168, 2579358, 0]

思考方式:

  1. 先把原本陣列的總和算出來
  2. 跑迴圈每次把第一個 element 丟掉
  3. 再把剩下的陣列算出總和
  4. 跑到空陣列為止塞入總和 0

Ruby 解法:

def parts_sums(ls)
  # 做一個空陣列準備放每次跑迴圈的 sum
  result = []

  # 先判斷傳入參數 ls 是否為空陣列
  return result << 0 if ls == []

  # 將 ls 的最大總和指定給 total
  total = ls.sum
  # 當陣列為空時需要回傳總和為 0 的數字,所以先塞一個 0 進陣列
  ls.unshift(0)
  
  # 使用 map 方法
  ls.map do |i|
    # 將運算結果指定給 result
    result.push(total -= i)
  end

  result
end

JavaScript 解法:

function partsSums(ls) {
  // 做一個空陣列準備放每次跑迴圈的 sum
  let result = [];

  // 先判斷傳入參數 ls 是否為空陣列
  if(ls[0] === undefined) {
    // 直接回傳 [0]
    result.push(0);
    return result;
  }

  // 若不是空陣列則先把最大總和指定給 total
  let total = ls.reduce((i, sum) => { return i + sum});
  // 當陣列為空時需要回傳總和為 0 的數字,所以先塞一個 0 進陣列
  ls.unshift(0);

  // 使用 map 方法
  result = ls.map(i => {
    // 將運算結果指定給 result
    return total -= i;
  });
  
  return result;
}

心得:
原本一開始想到的是使用迴圈下去跑

while (ls.length > 0) {
  // 把總和塞進 result
  result.push(total);
  // 再將總和減去 ls 第一個元素的值
  total -= ls.shift();
}

但是因為跑迴圈很耗時,一直無法通過測試,後來經過 Fred 提點才想起陣列還有更好用的 map 方法


上一篇
UAV to the Right!!!
下一篇
Sum of Digits / Digital Root
系列文
Codewar 進進出出 JS/Ruby30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言