题目链接:
题解:
1. 我刚开始想用栈,但是题目提到需要 O(1) 的时间复杂度,所以我放弃使用栈,因为这个涉及到数组的遍历,最后使用了map
2. map获取到的顺序和插入顺序一致,所以采用map这个数据结构
3. 使用map有几个坑没注意到,首先是 size 我下意识写成了方法,以及keys返回的是一个迭代器对象,而不是数组,我刚开始的写法是 keys()[0] 后面查了官方文档发现不对,最后改成 next().value ,获取第一个插入的元素的key 删掉
4. 实现思路很简单,如果当前map包含,则删除重新放入,如果超出最大size,则删去第一个然后继续放入。
5. 注意审题,题目提到如果不存在返回-1 而不是null
code:
/**
* @param {number} capacity
*/
var LRUCache = function (capacity) {
this.maxSize = capacity;
this.map = new Map()
};
/**
* @param {number} key
* @return {number}
*/
LRUCache.prototype.get = function (key) {
if (this.map.has(key)) {
//如果有这个key
let value = this.map.get(key)
this.map.delete(key)
this.map.set(key, value)
return value
}
else return -1
};
/**
* @param {number} key
* @param {number} value
* @return {void}
*/
LRUCache.prototype.put = function (key, value) {
if (this.map.has(key)) {
// 如果有这个key
this.map.delete(key)
this.map.set(key, value)
}
else {
if (this.map.size >= this.maxSize) {
console.log(this.map.keys().next().value)
this.map.delete(this.map.keys().next().value)
this.map.set(key, value)
}
else {
this.map.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)
*/