[Medium] LeetCode JS 30 - 2622. Cache with Time Limit

2024年3月6日

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

LeetCode 30 Days of JavaScript

本题来自 LeetCode 的 30 天 JacaScript 挑战

2622. Cache with Time Limit

题目描述

建立一个 TimeLimitedCache 类别,这个类别能让你取得与设定键值对 (key-value pair),同时能为每个键值对设定一个“过期时间”。

具体要实作三个方法:

  • set(key, value, duration): 接受一个整数的键 key、一个整数值 value,以及一个毫秒为单位的时间 duration。当持续时间结束后,这个键值对将不能被存取。如果相同且未过期的键存在,则回传 true,若不存在则回传 false。如果这个键已经存在,其值与持续时间都应该被新传入的 valueduration 覆写。
  • get(key):如果存在未过期的键,回传其对应的值。若没有相对应的键,则回传 1
  • count():回传现存未过期的键的总数量。
// 范例
输入:
actions = ["TimeLimitedCache", "set", "get", "count", "get"]
values = [[], [1, 42, 100], [1], [], [1]]
timeDelays = [0, 0, 50, 50, 150]

输出: [null, false, 42, 1, -1]

解释:
At t=0, 建立 TimeLimitedCache
At t=0,  (1: 42) 加入,该键值对会持续 100毫秒。因为原本还没有 1 这个键,所以回传 false
At t=50, 查看 key=1,因为还没到 100 毫秒,还没过期,所以回传 42
At t=50, 呼叫 count() 目前有一个键 (key=1),所以回传 1
At t=100, key=1 过期
At t=150, 这时呼叫 get(1),因为没有任何键,所以回传 -1

本题解答

以下是本题的解答,详细解题思路可以在 E+ 成长计划看到。如果想练习更多题目,推荐可以到 GreatFrontEnd 上练习

解法

解法一

var TimeLimitedCache = function () {
  this.cache = new Map();
};

TimeLimitedCache.prototype.set = function (key, value, duration) {
  const found = this.cache.has(key);
  if (found) {
    clearTimeout(this.cache.get(key).timerId);
  }
  this.cache.set(key, {
    value,
    timerId: setTimeout(() => this.cache.delete(key), duration),
  });
  return found;
};

TimeLimitedCache.prototype.get = function (key) {
  if (this.cache.has(key)) {
    return this.cache.get(key).value;
  } else {
    return -1;
  }
};

TimeLimitedCache.prototype.count = function () {
  return this.cache.size;
};

解法二

class TimeLimitedCache {
  constructor() {
    this.cache = new Map();
  }

  set(key, value, duration) {
    const found = this.cache.has(key);

    if (found) {
      clearTimeout(this.cache.get(key).timerId);
    }

    this.cache.set(key, {
      value,
      value,
      timerId: setTimeout(() => {
        this.cache.delete(key);
      }, duration),
    });

    return found;
  }

  get(key) {
    return this.cache.has(key) ? this.cache.get(key).value : -1;
  }

  count() {
    return this.cache.size;
  }
}
🧵 如果你想收到最即時的內容更新,可以在 FacebookInstagram 上追蹤我們