JavaScrip實(shí)現(xiàn)一個(gè)有時(shí)間限制的緩存類(lèi)的方式
題目描述
編寫(xiě)一個(gè)類(lèi),它允許獲取和設(shè)置鍵-值對(duì),并且每個(gè)鍵都有一個(gè) 過(guò)期時(shí)間 。
該類(lèi)有三個(gè)公共方法:
set(key, value, duration) :接收參數(shù)為整型鍵 key 、整型值 value 和以毫秒為單位的持續(xù)時(shí)間 duration 。一旦 duration 到期后,這個(gè)鍵就無(wú)法訪問(wèn)。如果相同的未過(guò)期鍵已經(jīng)存在,該方法將返回 true ,否則返回 false 。如果該鍵已經(jīng)存在,則它的值和持續(xù)時(shí)間都應(yīng)該被覆蓋。
get(key) :如果存在一個(gè)未過(guò)期的鍵,它應(yīng)該返回這個(gè)鍵相關(guān)的值。否則返回 -1 。
count() :返回未過(guò)期鍵的總數(shù)。
示例 1:
輸入: actions = ["TimeLimitedCache", "set", "get", "count", "get"] values = [[], [1, 42, 100], [1], [], [1]] timeDeays = [0, 0, 50, 50, 150] 輸出: [null, false, 42, 1, -1] 解釋: 在 t=0 時(shí),緩存被構(gòu)造。 在 t=0 時(shí),添加一個(gè)鍵值對(duì) (1: 42) ,過(guò)期時(shí)間為 100ms 。因?yàn)樵撝挡淮嬖冢虼朔祷豧alse。 在 t=50 時(shí),請(qǐng)求 key=1 并返回值 42。 在 t=50 時(shí),調(diào)用 count() ,緩存中有一個(gè)未過(guò)期的鍵。 在 t=100 時(shí),key=1 到期。 在 t=150 時(shí),調(diào)用 get(1) ,返回 -1,因?yàn)榫彺媸强盏摹?
示例 2:
輸入: actions = ["TimeLimitedCache", "set", "set", "get", "get", "get", "count"] values = [[], [1, 42, 50], [1, 50, 100], [1], [1], [1], []] timeDelays = [0, 0, 40, 50, 120, 200, 250] 輸出: [null, false, true, 50, 50, -1] 解釋: 在 t=0 時(shí),緩存被構(gòu)造。 在 t=0 時(shí),添加一個(gè)鍵值對(duì) (1: 42) ,過(guò)期時(shí)間為 50ms。因?yàn)樵撝挡淮嬖?,因此返回false。 當(dāng) t=40 時(shí),添加一個(gè)鍵值對(duì) (1: 50) ,過(guò)期時(shí)間為 100ms。因?yàn)橐粋€(gè)未過(guò)期的鍵已經(jīng)存在,返回 true 并覆蓋這個(gè)鍵的舊值。 在 t=50 時(shí),調(diào)用 get(1) ,返回 50。 在 t=120 時(shí),調(diào)用 get(1) ,返回 50。 在 t=140 時(shí),key=1 過(guò)期。 在 t=200 時(shí),調(diào)用 get(1) ,但緩存為空,因此返回 -1。 在 t=250 時(shí),count() 返回0 ,因?yàn)榫彺媸强盏模瑳](méi)有未過(guò)期的鍵。
提示:
- 0 <= key, value <= 109
- 0 <= duration <= 1000
- 1 <= actions.length <= 100
- actions.length === values.length
- actions.length === timeDelays.length
- 0 <= timeDelays[i] <= 1450
- actions[i] 是 "TimeLimitedCache"、"set"、"get" 和 "count" 中的一個(gè)。
- 第一個(gè)操作始終是 "TimeLimitedCache" 而且一定會(huì)以 0 毫秒的延遲立即執(zhí)行
解題思路
1、構(gòu)造函數(shù) TimeLimitedCache 創(chuàng)建了一個(gè)新的 Map 對(duì)象,并將其賦值給實(shí)例屬性 map
var TimeLimitedCache = function () {
this.map = new Map();
};
2、set 方法用于向緩存中添加一個(gè)鍵值對(duì),并設(shè)置該鍵值對(duì)的過(guò)期時(shí)間
- 首先,該方法調(diào)用 get 方法檢查緩存中是否已存在相同的鍵,如果存在,則將返回值 res 設(shè)置為 false,表示未過(guò)期的鍵已經(jīng)存在;
- 然后,創(chuàng)建一個(gè)包含 exceedTime 和 value 的對(duì)象,其中 exceedTime 表示過(guò)期時(shí)間,通過(guò)當(dāng)前時(shí)間加上指定的持續(xù)時(shí)間計(jì)算得到;
- 最后,將鍵值對(duì)存儲(chǔ)在 map 中,并返回 res。
TimeLimitedCache.prototype.set = function (key, value, duration) {
let res = true;
if(this.get(key) == -1) res = false;
const obj = {
exceedTime :new Date().getTime() + duration,
value
};
this.map.set(key,obj);
return res;
};
3、get 方法用于獲取指定鍵的值
- 首先,通過(guò)鍵從 map 中獲取對(duì)應(yīng)的值對(duì)象 obj;
- 如果找不到該鍵,則返回 -1 表示未找到;
- 然后,獲取值對(duì)象中的過(guò)期時(shí)間 exceedTime;
- 如果過(guò)期時(shí)間小于等于當(dāng)前時(shí)間,則表示鍵已過(guò)期,返回 -1;
- 否則,返回值對(duì)象的值。
TimeLimitedCache.prototype.get = function (key) {
const obj = this.map.get(key);
if(!obj) return -1;
const exceedTime = obj.exceedTime;
if(exceedTime <= new Date().getTime()) return -1;
return obj.value;
};
4、count 方法用于計(jì)算緩存中未過(guò)期的鍵的數(shù)量
- 首先,定義一個(gè)變量 cnt 并將其初始化為 0,用于記錄未過(guò)期的鍵的數(shù)量;
- 獲取當(dāng)前時(shí)間 dateTime;
- 然后,使用 forEach 方法遍歷 map 中的每個(gè)值對(duì)象 obj;
- 對(duì)于每個(gè)值對(duì)象,獲取其過(guò)期時(shí)間 exceedTime;
- 如果過(guò)期時(shí)間大于當(dāng)前時(shí)間,則將計(jì)數(shù)器 cnt 加一;
- 最后,返回計(jì)數(shù)器 cnt 的值。
TimeLimitedCache.prototype.count = function () {
let cnt = 0;
const dateTime = new Date().getTime();
this.map.forEach(obj=>{
const exceedTime = obj.exceedTime;
if(exceedTime > dateTime) cnt++;
})
return cnt;
};
AC代碼
var TimeLimitedCache = function () {
this.map = new Map();
};
/**
* @param {number} key
* @param {number} value
* @param {number} duration time until expiration in ms
* @return {boolean} if un-expired key already existed
*/
TimeLimitedCache.prototype.set = function (key, value, duration) {
let res = true;
if(this.get(key) == -1) res = false;
const obj = {
exceedTime :new Date().getTime() + duration,
value
};
this.map.set(key,obj);
return res;
};
/**
* @param {number} key
* @return {number} value associated with key
*/
TimeLimitedCache.prototype.get = function (key) {
const obj = this.map.get(key);
if(!obj) return -1;
const exceedTime = obj.exceedTime;
if(exceedTime <= new Date().getTime()) return -1;
return obj.value;
};
/**
* @return {number} count of non-expired keys
*/
TimeLimitedCache.prototype.count = function () {
let cnt = 0;
const dateTime = new Date().getTime();
this.map.forEach(obj=>{
const exceedTime = obj.exceedTime;
if(exceedTime > dateTime) cnt++;
})
return cnt;
};
/**
* const timeLimitedCache = new TimeLimitedCache()
* timeLimitedCache.set(1, 42, 1000); // false
* timeLimitedCache.get(1) // 42
* timeLimitedCache.count() // 1
*/
說(shuō)在后面
到此這篇關(guān)于JavaScrip實(shí)現(xiàn)一個(gè)有時(shí)間限制的緩存類(lèi)的方式的文章就介紹到這了,更多相關(guān)JavaScrip緩存類(lèi)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
three.js實(shí)現(xiàn)3D影院的原理的代碼分析
本篇文章主要給大家講解了如何通過(guò)three.js實(shí)現(xiàn)3D影院的功能以及原理分析,需要的朋友參考一下吧。2017-12-12
uni-app實(shí)現(xiàn)web-view圖片長(zhǎng)按下載解決方案
uniapp的web-view中圖片無(wú)法長(zhǎng)按保存,IOS下是正常的,但是Android下長(zhǎng)按無(wú)反應(yīng),這篇文章主要介紹了uni-app實(shí)現(xiàn)web-view圖片長(zhǎng)按下載解決方案,需要的朋友可以參考下2023-09-09
JS使用隊(duì)列對(duì)數(shù)組排列,基數(shù)排序算法示例
這篇文章主要介紹了JS使用隊(duì)列對(duì)數(shù)組排列,基數(shù)排序算法,涉及javascript隊(duì)列的定義、使用,基數(shù)排序?qū)崿F(xiàn)方法等相關(guān)操作技巧,需要的朋友可以參考下2019-03-03
鼠標(biāo)拖拽移動(dòng)子窗體的JS實(shí)現(xiàn)
這篇文章主要介紹了鼠標(biāo)拖拽移動(dòng)子窗體的JS實(shí)現(xiàn),需要的朋友可以參考下2014-02-02
JavaScript 產(chǎn)生不重復(fù)的隨機(jī)數(shù)三種實(shí)現(xiàn)思路
在 JavaScript 中,一般產(chǎn)生的隨機(jī)數(shù)會(huì)重復(fù),但是有時(shí)我們需要不重復(fù)的隨機(jī)數(shù),如何實(shí)現(xiàn)?本文給于解決方法,需要的朋友可以參考下2012-12-12
微信小程序如何保證每個(gè)頁(yè)面都已經(jīng)登陸詳解
前段時(shí)間發(fā)布了一個(gè)微信小程序的簡(jiǎn)單登錄,但遇到一個(gè)問(wèn)題,怎么確保用戶每個(gè)頁(yè)面都已經(jīng)登陸了呢,這篇文章主要給大家介紹了關(guān)于微信小程序如何保證每個(gè)頁(yè)面都已經(jīng)登陸的相關(guān)資料,需要的朋友可以參考下2021-11-11

