題目:
(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]
思考方式:
element
丟掉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 方法