[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;
}
}