牛客题霸NC93-设计LRU缓存结构-题解

设计LRU缓存结构

https://www.nowcoder.com/practice/e3769a5f49894d49b871c09cadd13a61?tpId=117&&tqId=35015&rp=1&ru=/ta/job-code-high&qru=/ta/job-code-high/question-ranking

经典的LRU缓存数据结构设计题,用HashMap和自定义双端队列结构实现,时间复杂度o(1),空间复杂度o(n)。

import java.util.*;

public class Solution {
    /**
     * lru design
     * @param operators int整型二维数组 the ops
     * @param k int整型 the k
     * @return int整型一维数组
     */
    class DNode{
        DNode next;
        DNode prev;
        int val;
        int key;
        public DNode(int val){
            this.val = val;
        }

        public DNode(int key, int val){
            this.key = key;
            this.val = val;
        }
    }

    public Solution(){
        head = new DNode(0);
        tail = new DNode(0);
        head.next = tail;
        tail.next = head;
        size = 0;
        map = new HashMap<>();
    }

    DNode head;
    DNode tail;
    int size;
    Map<Integer, DNode> map;
    int capacity;

    private void set(int key, int val){
        if (map.containsKey(key)){
            DNode node = map.get(key);
            node.val = val;
            delete(node);
            moveToFirst(node);
        }else{
            if(size == capacity){
                DNode last = tail.prev;
                delete(last);
                map.remove(last.key);
                size--;
            }
            DNode node = new DNode(key, val);
            map.put(key, node);
            size++;
            moveToFirst(node);
        }
    }

    private int get(int key){
        if (map.containsKey(key)){
            DNode node = map.get(key);
            delete(node);
            moveToFirst(node);
            return node.val;
        }else{
            return -1;
        }
    }

    private void delete(DNode node){
        DNode prev = node.prev;
        DNode next = node.next;
        prev.next = next;
        next.prev = prev;
    }

    private void moveToFirst(DNode node){
        DNode next = head.next;
        head.next = node;
        node.next = next;
        next.prev = node;
        node.prev = head;
    }

    public int[] LRU (int[][] operators, int k) {
        // write code here
        capacity = k;
        List<Integer> ans = new ArrayList<>();
        for (int[] operator : operators){
            if (operator[0] == 1){
                set(operator[1], operator[2]);
            }else{
                int temp = get(operator[1]);
                ans.add(temp);
            }
        }
        return ans.stream().mapToInt(Integer::intValue).toArray();
    }
}
全部评论

相关推荐

如题,鼠鼠快碎掉了。鼠鼠正在投暑期和日常的实习,可能是因为简历太差吧,好多初筛都没有过,所以其实格外珍惜每一次的约面。尤其鼠鼠是八股选手,但凡碰到喜欢问项目的面试官是直接速通鼠掉。那是一个万里无云的晚上,鼠鼠接到tx某子公司的约面,虽然没算法题但是问得我汗流浃背,面试官从我的八股批判到我的项目继而批判到我的实习,感觉基本上除了八股这种特定答案之外每一个问题都要质问我,尤其是询问到实习的时候我解释完之后直接来了一句“那你实习也啥也没做啊”,鼠鼠直接原地碎掉。之后的问题鼠鼠也不太记得了,大部分都是直接吟诵咒语,肌肉记忆直接不过脑子。因为接二连三的压力鼠鼠直接摆烂了,回答的时候也不太看屏幕直接开始搓...
机器人为什么是猫呀:楼主要自信。好的面试官是会照顾面试者情绪的,不会直接说那么伤人的话。面试表现其实很看自己的心态跟情绪,这些又和面试官的反馈很相关。而且有些面试官很高傲,不求甚解,自认为你的东西看一眼很简单,就不会听你说了,却没有从一个没有丰富工作经验的人的角度去思考。楼主不要因为这些影响心态,不要怀疑自己,只要遇到一个“合适”的面试官就会好很多的。
点赞 评论 收藏
分享
01-20 10:59
中北大学 运营
juntenor:这是详历,可不是简历
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务