给大家打个样

设计LRU缓存结构

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

import java.util.*;

public class Solution {
    private Map<Integer, Node> map = new HashMap<>();
    private Node head = new Node(-1,-1);
    private Node tail = new Node(-1,-1);
    private int k;
    public int[] LRU (int[][] operators, int k) {
        this.k = k;
        head.next = tail;
        tail.prev = head;
        int len = (int)Arrays.stream(operators).filter(x -> x[0] == 2).count();
        int[] res = new int[len];
        for(int i = 0, j = 0; i < operators.length; i++) {
            if(operators[i][0] == 1) {
                set(operators[i][1], operators[i][2]);
            } else {
                res[j++] = get(operators[i][1]);
            }
        }
        return res;
    }

    private void set(int key, int val) {
        if(get(key) > -1) {
            map.get(k).val = val;
        } else {
            if(map.size() == k) {
                int rk = tail.prev.key;
                tail.prev.prev.next = tail;
                tail.prev = tail.prev.prev;
                map.remove(rk);
            }
            Node node = new Node(key, val);
            map.put(key, node);
            moveToHead(node);
        }
    }

    private int get(int key) {
        if(map.containsKey(key)) {
            Node node = map.get(key);
            node.prev.next = node.next;
            node.next.prev = node.prev;
            moveToHead(node);
            return node.val;
        }
        return -1;
    }

    private void moveToHead(Node node) {
        node.next = head.next;
        head.next.prev = node;
        head.next = node;
        node.prev = head;
    }

    static class Node{
        int key, val;
        Node prev, next;
        public Node(int key, int val) {
            this.key = key;
            this.val = val;
        }
    }
}
全部评论
有bug 第26行 map.get(k).val = val; 括号里的k改成key就对了
9 回复 分享
发布于 2021-08-10 14:59
map.get(k).val = val; 应该是 map.get(key).val = val;才对吧,如果已经存在key,则复盖本来的值。
5 回复 分享
发布于 2021-05-22 23:25
有个问题,map.get(key).val = val;这里再覆盖原来的key值的时候是不是也相当于使用了,不需要去改变链表结构吗
4 回复 分享
发布于 2021-06-19 15:24
26行的k改成key
4 回复 分享
发布于 2021-11-02 09:48
当我没有读懂的时候,我以为我读懂了;当我读懂的时候,NM 🐮🍺!
2 回复 分享
发布于 2021-03-05 17:41
可是hashmap的containskey方法底层还是链表遍历或者树遍历,时间复杂度不就不是O(1)了吗
1 回复 分享
发布于 2021-03-26 08:53
强的压批
1 回复 分享
发布于 2021-06-16 14:21
很强
1 回复 分享
发布于 2021-06-28 22:05
牛🐂
点赞 回复 分享
发布于 2020-12-07 16:59
可以,很通俗易懂
点赞 回复 分享
发布于 2020-12-31 18:19
牛啊
点赞 回复 分享
发布于 2021-07-05 21:42
不懂就问,请问为什么内部类Node设置为静态内部类?
点赞 回复 分享
发布于 2021-09-03 18:44
但是我把代码复制进去,显示14/16通过啊
点赞 回复 分享
发布于 2021-09-28 18:52
可以,这是空间和时间最好的选择吧。哈希表查+链表存
点赞 回复 分享
发布于 2021-12-22 17:32
move2head函数有问题
点赞 回复 分享
发布于 2021-12-28 11:24

相关推荐

11-06 10:58
已编辑
门头沟学院 嵌入式工程师
双非25想找富婆不想打工:哦,这该死的伦敦腔,我敢打赌,你简直是个天才,如果我有offer的话,我一定用offer狠狠的打在你的脸上
点赞 评论 收藏
分享
双非坐过牢:非佬,可以啊10.28笔试,11.06评估11.11,11.12两面,11.19oc➕offer
点赞 评论 收藏
分享
评论
114
18
分享
牛客网
牛客企业服务