iT邦幫忙

2023 iThome 鐵人賽

DAY 10
0

2705. Compact Object

解題程式碼

var compactObject = function (obj) {
  if (obj === null || typeof obj !== 'object') {
    return obj;
  }

  if (Array.isArray(obj)) {
    return obj.filter(Boolean).map(compactObject);
  }

  const result = {};
  for (const key in obj) {
    let value = compactObject(obj[key]);
    if (Boolean(value)) {
      result[key] = value;
    }
  }
  return result;
};

解題思路、演算法

首先要將物件和陣列型別的值排除,直接 return,所以使用 typeof 去判斷,而 typeof null 是 object (JS 的 bug),所以額外拉出來處理

再來處理陣列,用 filter 將 falsy value 過濾,用遞迴的方式處理深層的陣列

最後處理物件,物件的值因為可能是陣列,所以也用遞迴方式處理,最後將過濾 falsy 後的值存到要最終結果的物件內

解法的時間、空間複雜度

時間複雜度: O(n)
空間複雜度: O(n)

2715. Execute Cancellable Function With Delay

解題程式碼

var cancellable = function (fn, args, t) {
  // call setTimeout, which is set to call fn after t amount of time
  var timeout = setTimeout(() => fn(...args), t);

  // define a clearTimeout
  var cancelFn = () => clearTimeout(timeout);

  // When/if we call the function, it will return cancelFn,
  // and since the return line calls (and consequentially executes)
  // cancelFn, timeout will be cancelled, thereby cancelling fn
  return cancelFn;
};

解題思路、演算法

題目看了會兒才懂,簡單講就是如果在取消的時間到時還沒執行 fn 函式的話,就呼叫 cancelFn 函式,反之則執行 fn 函式,cancelFn 函式就不執行

return 的部分讓我想到 React useEffect 的 clearup 函式

解法的時間、空間複雜度

時間複雜度: O(1)
空間複雜度: O(1)

參考資料

2722. Join Two Arrays by ID

解題程式碼

HashMap 寫法

var join = function (arr1, arr2) {
  const resultMap = new Map();

  [...arr1, ...arr2].forEach((ele) => {
    if (!resultMap.get(ele.id)) {
      resultMap.set(ele.id, ele);
    } else {
      const preObj = resultMap.get(ele.id);
      resultMap.set(ele.id, { ...JSON.parse(JSON.stringify(preObj)), ...ele });
    }
  });

  const result = [];
  resultMap.forEach((value) => {
    result.push(value);
  });
  return result.sort((a, b) => a.id - b.id);
};

物件寫法

var join = function (arr1, arr2) {
  const result = [];

  [...arr1, ...arr2].forEach((ele) => {
    if (!result[ele.id]) {
      result[ele.id] = ele;
    } else {
      result[ele.id] = { ...JSON.parse(JSON.stringify(result[ele.id])), ...ele };
    }
  });
  return Object.values(result);
};

解題思路、演算法

將兩個陣列合併,然後用 hashMap 或是物件去儲存元素值,特別的是會用 id 當作 key,所以檢查到重覆 key 時就去做題目要求的處理

解法的時間、空間複雜度

時間複雜度: O(n)
空間複雜度: O(n)

2723. Add Two Promises

解題程式碼

var addTwoPromises = async function (promise1, promise2) {
  const [res1, res2] = await Promise.all([promise1, promise2]);
  return res1 + res2;
};

解題思路、演算法

這題考的是 Promise.all(),可參考我以前寫的文章:

https://ithelp.ithome.com.tw/articles/10293058

解法的時間、空間複雜度

時間複雜度: O(max(promise1 time, promise2 time))
空間複雜度: O(1)

參考資料


上一篇
Day9-[30 Days of JavaScript] LeeCode 2629、2637、2665、2704
下一篇
Day11-[Grind 169 questions][Array] LeetCode 121、57、15
系列文
那些年我沒寫到的資料結構和 LeetCode 題目練習30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言