LRUCache

他們說我帥發表於2018-03-13

昨天面試題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);
複製程式碼

最終面試失敗了。這是來北京半個月的唯一一次面試。 流下了沒有技術的淚水 ~ ~

如果有公司要初級前端的話,希望給個內推。謝謝!

覺得勉強可以的話,請點個贊,謝謝!

如果程式碼有問題,請指出,謝謝!