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

设计LRU缓存结构

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

使用链表来模拟缓存结构,表头元素表示最近使用的key

set

检查链表中是否存在该key,若有则更新map中保存的value,并将该key从链表中删除同时在链表头插入。若没有该key,则在链表头插入该key(注意需要先判断链表大小是否越界,若越界则先删除链表尾元素再头插)

get

若链表中有该key,则返回对应的value,同时在链表中删除该key,再在头部插入。
若没有,返回-1

import java.util.*;


public class Solution {
    LinkedList<Integer> list = new LinkedList<>();
    int k = 0;
    List<Integer> ans = new ArrayList<>();
    Map<Integer, Integer> map = new HashMap<>();

    /**
     * lru design
     * @param operators int整型二维数组 the ops
     * @param k int整型 the k
     * @return int整型一维数组
     */
    public int[] LRU (int[][] operators, int k) {
        // write code here
        this.k = k;
        for(int i = 0; i < operators.length;i++){
            if(operators[i][0] == 1){
                set(operators[i][1], operators[i][2]);
            }else{
                get(operators[i][1]);
            }
        }

        int[] res = new int[ans.size()];
        for(int i = 0; i < ans.size();i++){
            res[i] = ans.get(i);
        }
        return res;
    }

    public void set(int key, int val){
        if(list.contains(key)){
            list.remove((Object)key);
            list.addFirst(key);
            map.put(key, val);
            return;
        }

        if(list.size() == k){
            map.remove(list.getLast());
            list.removeLast();
        }

        list.addFirst(key);
        map.put(key, val);

    }

    public void get(int key){
        if(list.contains(key)){
            list.remove((Object)key);
            list.addFirst(key);
            ans.add(map.get(key));
            return;
        }

        ans.add(-1);
    }
}
全部评论

相关推荐

2024-12-29 11:08
湖南工业大学 Java
程序员牛肉:简历没什么大问题了。 而且不要再换项目了。三月份就开暑期实习了,现在都一月份了。实在来不及重新开一下项目了。把一个项目写完或许很快,但是把一个项目搞懂吃透并不简单。所以不要换项目了,把你简历上面的两个项目好好挖一挖吧。 具体 体现在:你能不能流利的说出你的项目的每一个功能点代码实现?你能不能说出在这块除了A技术之外,还有其他技术能够实现嘛?如果有其他技术能够实现,那你这块为什么选择了你当前用的这个技术?
投递牛客等公司
点赞 评论 收藏
分享
评论
1
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务