LRUCache

昨天面试题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);
复制代码

最终面试失败了。这是来北京半个月的唯一一次面试。 流下了没有技术的泪水 ~ ~

如果有公司要初级前端的话,希望给个内推。谢谢!

觉得勉强可以的话,请点个赞,谢谢!

如果代码有问题,请指出,谢谢!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值