[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
。如果这个键已经存在,其值与持续时间都应该被新传入的value
与duration
覆写。 - 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;
}
}