面试经典-4-LRU 缓存

题目

请你设计并实现一个满足 LRU (最近最少使用) 缓存 约束的数据结构。
实现 LRUCache 类:
LRUCache(int capacity) 以 正整数 作为容量 capacity 初始化 LRU 缓存
int get(int key) 如果关键字 key 存在于缓存中,则返回关键字的值,否则返回 -1 。
void put(int key, int value) 如果关键字 key 已经存在,则变更其数据值 value ;如果不存在,则向缓存中插入该组 key-value 。如果插入操作导致关键字数量超过 capacity ,则应该 逐出 最久未使用的关键字。
函数 get 和 put 必须以 O(1) 的平均时间复杂度运行。

示例:

输入
[“LRUCache”, “put”, “put”, “get”, “put”, “get”, “put”, “get”, “get”, “get”]
[[2], [1, 1], [2, 2], [1], [3, 3], [2], [4, 4], [1], [3], [4]]
输出
[null, null, null, 1, null, -1, null, -1, 3, 4]

解释
LRUCache lRUCache = new LRUCache(2);
lRUCache.put(1, 1); // 缓存是 {1=1}
lRUCache.put(2, 2); // 缓存是 {1=1, 2=2}
lRUCache.get(1); // 返回 1
lRUCache.put(3, 3); // 该操作会使得关键字 2 作废,缓存是 {1=1, 3=3}
lRUCache.get(2); // 返回 -1 (未找到)
lRUCache.put(4, 4); // 该操作会使得关键字 1 作废,缓存是 {4=4, 3=3}
lRUCache.get(1); // 返回 -1 (未找到)
lRUCache.get(3); // 返回 3
lRUCache.get(4); // 返回 4

// 22.15 - 22.30
// 失败
class LRUCache {
    class Node {
        int key;
        int value;
        Node pre;
        Node next;

        Node(int key, int value) {
            this.key = key;
            this.value = value;
        }
    }

    public Map<Integer, Node> map;
    public Node head;
    public Node tail;
    public Integer capacity;

    public LRUCache(int capacity) {
        this.capacity = capacity;
        this.map = new HashMap<>();
        this.head = new Node(-1, -1);
        this.tail = new Node(-1, -1);
        head.next = tail;
        tail.pre = head;
    }

    public int get(int key) {
        if (map.containsKey(key)) {
            Node node = map.get(key);
            delete(node);
            insert(node);
            return node.value;
        } else {
            return -1;
        }
    }

    public void put(int key, int value) {
        if (map.containsKey(key)) {
            Node node = map.get(key);
            delete(node);
            node.value = value;
            insert(node);
        } else {
            Node node = new Node(key, value);
            if (map.size() < capacity) {
                insert(node);
            } else {
                insert(node);
                Node toDelete = head.next;
                delete(toDelete);
                map.remove(toDelete.key);
            }
            map.put(key, node);
        }

    }

    private void insert(Node node) {
        Node preNode = tail.pre;
        preNode.next = node;
        node.pre = preNode;

        node.next = tail;
        tail.pre = node;
    }

    private void delete(Node node) {
        Node preNode = node.pre;
        Node nextNode = node.next;

        preNode.next = nextNode;
        nextNode.pre = preNode;
    }
}

相关推荐

  1. 面试经典-4-LRU 缓存

    2024-03-13 05:24:06       18 阅读
  2. 面试算法-102-LRU 缓存

    2024-03-13 05:24:06       14 阅读
  3. 面试算法-168-LRU 缓存

    2024-03-13 05:24:06       12 阅读
  4. <span style='color:red;'>LRU</span><span style='color:red;'>缓存</span>

    LRU缓存

    2024-03-13 05:24:06      29 阅读
  5. 【难点】【LRU】146.LRU缓存

    2024-03-13 05:24:06       43 阅读
  6. 经典网络面试题(4

    2024-03-13 05:24:06       31 阅读

最近更新

  1. TCP协议是安全的吗?

    2024-03-13 05:24:06       19 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-03-13 05:24:06       19 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-03-13 05:24:06       19 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-03-13 05:24:06       20 阅读

热门阅读

  1. 使用SpringBoot实现定时任务

    2024-03-13 05:24:06       23 阅读
  2. 子查询的特殊用途

    2024-03-13 05:24:06       22 阅读
  3. 双指针算法———C++

    2024-03-13 05:24:06       25 阅读
  4. docker搭建upload-labs

    2024-03-13 05:24:06       19 阅读
  5. 大数据开发(HBase面试真题-卷二)

    2024-03-13 05:24:06       20 阅读
  6. 嵌入式学习day36 数据结构

    2024-03-13 05:24:06       22 阅读
  7. 常用网络命令的使用

    2024-03-13 05:24:06       20 阅读
  8. 嵌入式学习day35

    2024-03-13 05:24:06       20 阅读
  9. openGauss gsql 常用元命令 一

    2024-03-13 05:24:06       20 阅读
  10. 3.11笔记2

    2024-03-13 05:24:06       18 阅读