[Medium] LeetCode JS 30 - 2623. Memoize (记忆函式)

2024年3月5日

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

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 上追蹤我們