[Medium] LeetCode JS 30 - 2623. Memoize (記憶函式)

2024年3月5日

💎 加入 E+ 成長計畫 與超過 400+ 位軟體工程師一同在社群中成長,並且獲得更多的軟體工程學習資源

LeetCode 30 Days of JavaScript

本題來自 LeetCode 的 30 天 JacaScript 挑戰

2623. Memoize (記憶函式)

題目描述

在寫程式時,如果不想做重複的複雜運算,我們經常會透過快取 (cache) 來實現。快取的意思是先把過去已經運算過的輸出存起來,如果之後有同樣的輸入,未來就不用再運算一次,而是直接從快取拿之前算過的,這能有效省去時間。因為快取很好用,在實際工作上經常會用到,這也讓 Memoize 這類函式成了常考的面試題目。

具體來說,memoize 會接收一個函式,然後回傳一個帶有記憶化 (快取) 的函式。對輸出的函式來說,如果某個輸入已經被運算過,就不會重複運算,直接從快取回傳即可。

舉例來說,有個 sum 函式,會回傳兩個參數的相加

const sum = (a, b) => a + b;

今天如果被 memoize 後獲得 memoizedSum,會有以下的作用

const memoizedSum = memoize(sum);
memoizedSum(2, 2); // 4 這是經過運算的
memoizedSum(2, 2); // 4 這是直接從快取拿的,不用再次運算

本題解答

以下是本題的解答,詳細解題思路可以在 E+ 成長計畫看到。如果想練習更多題目,推薦可以到 GreatFrontEnd 上練習

解法

function memoize(fn) {
  const cache = {};

  return (...args) => {
    const key = JSON.stringify(args);
    if (key in cache) {
      return cache[key];
    } else {
      const val = fn(...args);
      cache[key] = val;
      return val;
    }
  };
}
🧵 如果你想收到最即時的內容更新,可以在 FacebookInstagram 上追蹤我們