1、题目

运用你所掌握的数据结构,设计和实现一个  LRU (最近最少使用) 缓存机制 。
实现 LRUCache 类:

LRUCache(int capacity) 以正整数作为容量 capacity 初始化 LRU 缓存
int get(int key) 如果关键字 key 存在于缓存中,则返回关键字的值,否则返回 -1 。
void put(int key, int value) 如果关键字已经存在,则变更其数据值;如果关键字不存在,则插入该组「关键字-值」。当缓存容量达到上限时,它应该在写入新数据之前删除最久未使用的数据值,从而为新的数据值留出空间。

2、想法及实践

第一想到的是用数组(最熟悉)来模拟队列,但最后的一个用例不能通过,爆栈了。

后来参考了题解,发现Map是有,获取最新的数据排列的方法 keys().next().value

参考思路,自己实现了,好使,记录一下

3、实现代码如下:

/**
 * @param {number} capacity
 */
var LRUCache = function(capacity) {
    this.cache=new Map()
    this.capacity=capacity
};

/**
 * @param {number} key
 * @return {number}
 */
LRUCache.prototype.get = function(key) {
    let res=-1
    if(this.cache.has(key)){
        res=this.cache.get(key)
        this.cache.delete(key)
        this.cache.set(key,res)
    }
    return res
};

/**
 * @param {number} key
 * @param {number} value
 * @return {void}
 */
LRUCache.prototype.put = function(key, value) {
    if(this.cache.has(key)){
        this.cache.delete(key)
        this.cache.set(key,value)
    }else{
        // 判断容量上限
        if(this.cache.size==this.capacity){
            // 获取到添加顺序的key值
            const iteratorKey = this.cache.keys();
            this.cache.delete(iteratorKey.next().value)
        }
        this.cache.set(key,value)
    }
};

/**
 * Your LRUCache object will be instantiated and called as such:
 * var obj = new LRUCache(capacity)
 * var param_1 = obj.get(key)
 * obj.put(key,value)
 */

参考链接

力扣链接

03-05 21:33