手撕LRU缓存Java版(带输入输出)

由于面试手撕lru没撕出来,导致心态炸裂,今天特地练习了lru输入输出

手撕版,在每个函数里手动加上输出

java 复制代码
public class LC146 {
    static class LRUCache{
        class Node{
            int key, value;
            Node prev, next;
            Node(int key, int value){
                this.key = key;
                this.value = value;
            }
        }
        private Node dummy = new Node(0,0);
        private int capacity;

        private Map<Integer, Node> map = new HashMap<Integer, Node>();
        public LRUCache(int capacity){
            this.capacity = capacity;
            dummy.prev = dummy;
            dummy.next = dummy;
            System.out.print("null,");
        }

        public int get(int key) {
            Node node = getNode(key);
            if(node == null){
                System.out.print("-1,");
                return -1;
            }else{
                System.out.print(node.value+",");
                return node.value;
            }
        }

        private Node getNode(int key) {
            Node node = map.getOrDefault(key, null);
            if(node == null){
                return null;
            }
            deleteNode(node);
            pushFront(node);
            return node;
        }

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

        private void pushFront(Node node) {
            node.next = dummy.next;
            node.prev = dummy;
            node.prev.next = node;
            node.next.prev = node;
        }

        public void put(int key, int value) {
            Node node = getNode(key);
            if(node != null){
                node.value = value;
                return ;
            }
            node = new Node(key, value);
            pushFront(node);
            map.put(key, node);
            if(map.size() > capacity){
                map.remove(dummy.prev.key);
                deleteNode(dummy.prev);
            }
            System.out.print("null,");
        }
    }

    public static void main(String[] args) {
        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
    }
}

leetcode输入输出格式版

java 复制代码
public class LC146 {
    static class LRUCache{
        class Node{
            int key, value;
            Node prev, next;
            Node(int key, int value){
                this.key = key;
                this.value = value;
            }
        }
        private Node dummy = new Node(0,0);
        private int capacity;

        private Map<Integer, Node> map = new HashMap<Integer, Node>();
        public LRUCache(int capacity){
            this.capacity = capacity;
            dummy.prev = dummy;
            dummy.next = dummy;
            System.out.print("null,");
        }

        public int get(int key) {
            Node node = getNode(key);
            if(node == null){
                System.out.print("-1,");
                return -1;
            }else{
                System.out.print(node.value+",");
                return node.value;
            }
        }

        private Node getNode(int key) {
            Node node = map.getOrDefault(key, null);
            if(node == null){
                return null;
            }
            deleteNode(node);
            pushFront(node);
            return node;
        }

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

        private void pushFront(Node node) {
            node.next = dummy.next;
            node.prev = dummy;
            node.prev.next = node;
            node.next.prev = node;
        }

        public void put(int key, int value) {
            Node node = getNode(key);
            if(node != null){
                node.value = value;
                return ;
            }
            node = new Node(key, value);
            pushFront(node);
            map.put(key, node);
            if(map.size() > capacity){
                map.remove(dummy.prev.key);
                deleteNode(dummy.prev);
            }
            System.out.print("null,");
        }
    }

    public static void main(String[] args) {
        String[] s = new String[]{"LRUCache", "put", "put", "get", "put", "get", "put", "get", "get", "get"};
        int[][] inputs = new int[][]{{2}, {1, 1}, {2, 2}, {1}, {3, 3}, {2}, {4, 4}, {1}, {3}, {4}};
        int n = s.length;
        LRUCache lruCache = null;
        for(int i=0; i<n; i++){
            if(s[i].equals("LRUCache")){
                lruCache = new LRUCache(inputs[i][0]);
                System.out.print("null");
            }else if(s[i].equals("put")){
                lruCache.put(inputs[i][0], inputs[i][1]);
                System.out.print("null");
            }else if(s[i].equals("get")){
                int ans = lruCache.get(inputs[i][0]);
                System.out.print(ans);
            }
            if(i != n-1){
                System.out.print(",");
            }
        }
    }
}

测试结果

相关推荐
lingggggaaaa10 小时前
小迪安全v2023学习笔记(一百三十四讲)—— Windows权限提升篇&数据库篇&MySQL&MSSQL&Oracle&自动化项目
java·数据库·windows·笔记·学习·安全·网络安全
迦蓝叶10 小时前
JAiRouter v1.0.0 正式发布:企业级 AI 服务网关的开源解决方案
java·运维·人工智能·网关·spring·ai·开源
安卓开发者10 小时前
鸿蒙NEXT应用接入快捷栏:一键直达,提升用户体验
java·harmonyos·ux
yudiandian201411 小时前
03 Eclipse 配置 JDK 环境
java·ide·eclipse
_码力全开_11 小时前
P1005 [NOIP 2007 提高组] 矩阵取数游戏
java·c语言·c++·python·算法·矩阵·go
陈一Tender11 小时前
JavaWeb后端实战(登录认证 & 令牌技术 & 拦截器 & 过滤器)
java·开发语言·spring boot·mysql
Camel卡蒙11 小时前
红黑树详细介绍(五大规则、保持平衡操作、Java实现)
java·开发语言·算法
孤廖11 小时前
吃透 C++ 栈和队列:stack/queue/priority_queue 用法 + 模拟 + STL 标准实现对比
java·开发语言·数据结构·c++·人工智能·深度学习·算法
我命由我1234511 小时前
Android 对话框 - 对话框全屏显示(设置 Window 属性、使用自定义样式、继承 DialogFragment 实现、继承 Dialog 实现)
android·java·java-ee·android studio·android jetpack·android-studio·android runtime