题解 | #设计LRU缓存结构#

设计LRU缓存结构

http://www.nowcoder.com/practice/e3769a5f49894d49b871c09cadd13a61

设计LRU缓存结构
哈希表+顺序链表(理解为散列表+队列)
其原理在于:
哈希表用于存储数据
队列用于记录顺序

public int[] LRU (int[][] operators, int k) {
        // write code here
        //用于记录最新访问的队列
        ArrayList<Integer> table=new ArrayList<>();
        //用于存储数据的哈希表【使用String作为key的类型避免了重写比较方法】
        HashMap<String,Integer> map=new HashMap<>();
        //用于记录输出的集合
        ArrayList<Integer> r=new ArrayList<>();
        //遍历输入集
        for(int[] m:operators){
            //以首个数据为关键字划分策略
            switch(m[0]){
                //为1执行插入
                case 1:
                   //如果表还未满
                   if(table.size()<k){
                       //插入的key值
                       int key=m[1];
                       //插入的value值
                       int value=m[2];
                      //检查是否已经包含该key
                      if(map.containsKey(key)){
                          //包含的情况移除该key在队列中的位置【因为传入int型数据会调用index的方法这里使用包装类】
                          table.remove(new Integer(key));
                          //将key加入队列末尾
                          table.add(key);
                          //更新值
                          map.put(key+"",value);
                      }else{
                          //如果不包含该key,向队列末尾添加该key
                          table.add(key);
                          //添加值
                          map.put(key+"",value);
                      }

                   } else{
                       //如果表已满
                       int key=m[1];
                       int value=m[2];
                       //获取队列中,最前面的key值
                       int oldKey=table.get(0);
                       //从队列中移出该key
                       table.remove(new Integer(oldKey));
                       //添加新key
                       table.add(key);
                       //在表中移出旧的值
                       map.remove(oldKey+"");
                       //添加新值
                       map.put(key+"",value);
                   }
                    break;
                //为2执行查询
                case 2:

                    int gkey=m[1];
                    if(map.get(gkey+"")==null){
                        //为空则将输出集中加入-1
                        r.add(-1);
                    }else{
                        //不为空加入查询结果
                        r.add(map.get(gkey+""));
                        //移出队列中该key的位置,并将其加在队列末尾
                        table.remove(new Integer(gkey));
                        table.add(gkey);
                    }

            }
        }
        //将结构转换为函数标准输出并返回。
        final int size=r.size();
        int[] re=new int[size];
        for(int i=0;i<r.size();i++){
            re[i]=r.get(i);
        }
        return re;
    }
全部评论

相关推荐

昨天 18:54
门头沟学院 Java
点赞 评论 收藏
分享
11-24 00:11
已编辑
广东工业大学 算法工程师
避雷深圳&nbsp;&nbsp;yidao,试用期&nbsp;6&nbsp;个月。好嘛,试用期还没结束,就直接告诉你尽快找下一家吧,我谢谢您嘞
牛客75408465号:笑死,直属领导和 hr 口径都没统一,各自说了一些离谱的被裁理由,你们能不能认真一点呀,哈哈哈哈哈😅😅😅
点赞 评论 收藏
分享
点赞 收藏 评论
分享
牛客网
牛客企业服务