昨天面試題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);
複製程式碼
最終面試失敗了。這是來北京半個月的唯一一次面試。 流下了沒有技術的淚水 ~ ~
如果有公司要初級前端的話,希望給個內推。謝謝!
覺得勉強可以的話,請點個贊,謝謝!