iT邦幫忙

2022 iThome 鐵人賽

DAY 21
0
自我挑戰組

30天演算法解題系列 第 21

Day 21:product sum

  • 分享至 

  • xImage
  •  

problem

輸入為一個不為空的陣列,元素為整數或陣列,內層的陣列中也可能包含整數或陣列...以此類推。回傳陣列的 '商品總和',每一個陣列的商品總和代表元素和 * 陣列層數

舉例來說,
[ ] 層數為 1,[x, y] 的產品總和為 x + y,
[ [ ] ] 內層陣列層數為 2,[x, [y, z]] 的產品總和為 x + 2(y + z),
[ [ [ ] ] ] 最內層陣列層數為 3,[x, [y, [z]]] 的產品總和為 x + 2(y + 3z)。

sample input:
array = [5, 2, [7, -1], 3, [6, [-13, 8],4]]

sample output:
12

基本的想法是,計算陣列元素總合的過程中,可以以遞迴的方式對內層的陣列進行同樣的計算。具體的步驟為:

  1. 遍歷第一層陣列,以變數記錄元素和 (sum) 及層數 (h),最終回傳的商品總和可以表達為 sum * h。
  2. 遍歷時若碰到數字,則加入 sum 之中。若碰到內層陣列,對陣列呼叫遞迴式,並傳入 h + 1 代表層數加一...以此類推,對全部的元素進行計算。每一個遞迴式最後都會回傳 sum * h 代表該層陣列的總和,加總後即為整個輸入陣列的商品總和。

time: O(N) N 代表輸入陣列及子陣列中的所有元素數量,以上方範例輸入來說為 12。
space: O(h) h 代表陣列的最高層數,因為每增加一層就會呼叫一次遞迴式,所以也等於遞迴的堆疊數。

function productSum(array, h = 1) {
  let sum = 0;
  for (const element of array) {
    if (Array.isArray(element)) {
      sum += productSum(element, h + 1);
    }
    else {
      sum += element;
    }
  }
  return sum * h;
}

上一篇
Day 20:find three largest numbers
下一篇
Day 22:search in sorted matrix
系列文
30天演算法解題30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言