昨天面试题LRUCache,分享给大家。(Least Recently Used)。 HR说半小时,可以上网。(当然啦,我面试从来不作弊,不会就不会,真实水平就好)
题目要求: 需要支持以下方法
get(key)获取数据,有则返回,否则返回-1
set(key value) 添加/修改,如果缓存到达最大容量,需要删除最久未使用的数据
Example
const cache = new LRUCache(2 /* capacity */);
cache.set(1,1);
cache.set(2,2);
cache.get(1); // returns 1
cache.set(3,3);
cache.get(2); // return -1
......
复制代码
感兴趣可以实现下。面试时没做好,bug很多。面试官指出了问题。下午就重新实现了下, !!!半小时根本不够好不好。我直接贴代码,有注释就不说过程了.
// 此段代码会多次使用,就封了个函数
function refreshArr(arr, value) {
try{
let index = arr.indexOf(value);
let v = arr.splice(index, 1)[0]; // * 返回的数组
arr.push(v)
}catch(e) {
throw Error(e)
}
}
复制代码
// 构造函数,es5
function LRUCache(n) {
// * @param容量长度 type: number
this.capacity = n;
this.cacheArray = [];
this.cacheObj= {};
}
复制代码
LRUCache.prototype.get = function(key) {
let value = this.cacheObj[key],
cacheArray = this.cacheArray;
refreshArr(cacheArray, key);
return value ? value : -1;
};
复制代码
LRUCache.prototype.set = function(key, value) {
let cacheObj = this.cacheObj,
cacheArray = this.cacheArray;
// 如果有这个key,就覆盖原数据
if(cacheObj[key]) {
cacheObj[key] = value;
// 更新数组
refreshArr(cacheArray, key)
}else{
// 这是新增的数据
// 判断容量
if(cacheArray.length < this.capacity) {
cacheObj[key] = value;
cacheArray.push(key);
}else{
// 找到第一个并删除
let LRUValue = cacheArray[0];
delete cacheObj[LRUValue];
cacheArray.shift();
// 再放数据进去
cacheObj[key] = value;
cacheArray.push(key);
}
}
// 返回剩余容量数
return this.capacity - cacheArray.length;
};
复制代码
// const urlCache = new LRUCache(3);
复制代码
最终面试失败了。这是来北京半个月的唯一一次面试。 流下了没有技术的泪水 ~ ~
如果有公司要初级前端的话,希望给个内推。谢谢!
觉得勉强可以的话,请点个赞,谢谢!