首页
题库
公司真题
专项练习
面试题库
在线编程
面试
面试经验
AI 模拟面试
简历
求职
学习
基础学习课
实战项目课
求职辅导课
专栏&文章
竞赛
搜索
我要招人
发布职位
发布职位、邀约牛人
更多企业解决方案
AI面试、笔试、校招、雇品
HR免费试用AI面试
最新面试提效必备
登录
/
注册
热心市民锅锅
西安电子科技大学 Java
发布于广东
关注
已关注
取消关注
@小德同学:
LRU缓存结构
方法:哈希表+双向链表知识点1:哈希表哈希表是一种根据关键码(key)直接访问值(value)的一种数据结构。而这种直接访问意味着只要知道key就能在O(1)O(1)O(1)时间内得到value,因此哈希表常用来统计频率、快速检验某个元素是否出现过等。知识点2:双向链表双向链表是一种特殊的链表,它除了链表具有的每个节点指向后一个节点的指针外,还拥有一个每个节点指向前一个节点的指针,因此它可以任意向前或者向后访问,每次更改节点连接状态的时候,需要变动两个指针。思路:插入与访问值都是O(1)O(1)O(1),没有任何一种数据结构可以直接做到。于是我们可以想到数据结构的组合:访问O(1)O(1)O(1)很容易想到了哈希表;插入O(1)O(1)O(1)的数据结构有很多,但是如果访问到了这个地方再选择插入,且超出长度要在O(1)O(1)O(1)之内删除,我们可以想到用链表,可以用哈希表的key值对应链表的节点,完成直接访问。但是我们还需要把每次访问的key值节点加入链表头,同时删掉链表尾,所以选择双向链表,便于删除与移动。于是我们的方法就是哈希表+双向链表。具体做法:step 1:构建一个双向链表的类,记录key值与val值,同时一前一后两个指针。用哈希表存储key值和链表节点,这样我们可以根据key值在哈希表中直接锁定链表节点,从而实现在链表中直接访问,能够做到O(1)O(1)O(1)时间访问链表任意节点。 //设置双向链表结构 class Node{ int key; int val; Node pre; Node next; //初始化 public Node(int key, int val) { this.key = key; this.val = val; this.pre = null; this.next = null; } }step 2:设置全局变量,记录双向链表的头、尾及LRU剩余的大小,并全部初始化,首尾相互连接好。//构建初始化连接//链表剩余大小this.size = k;this.head.next = this.tail;this.tail.pre = this.head;step 3:遍历函数的操作数组,检查第一个元素判断是属于set操作还是get操作。step 4:如果是set操作,即将key值与val值加入链表,我们先检查链表中是否有这个key值,可以通过哈希表检查出,如果有直接通过哈希表访问链表的相应节点,修改val值,并将访问过的节点移到表头;如果没有则需要新建节点加到表头,同时哈希表中增加相应key值(当然,还需要检查链表长度还有无剩余,若是没有剩余则需要删去链表尾)。//没有见过这个key,新值加入if(!mp.containsKey(key)){ Node node = new Node(key, val); mp.put(key, node); //超出大小,移除最后一个 if(size <= 0) removeLast(); //大小还有剩余 else //大小减1 size--; //加到链表头 insertFirst(node); }//哈希表中已经有了,即链表里也已经有了else{ mp.get(key).val = val; //访问过后,移到表头 moveToHead(mp.get(key)); }step 5:不管是新节点,还是访问过的节点都需要加到表头,若是访问过的,需要断开原来的连接,再插入表头head的后面。//移到表头函数void moveToHead(Node node){ //已经到了表头 if(node.pre == head) return; //将节点断开,取出来 node.pre.next = node.next; node.next.pre = node.pre; //插入第一个前面 insertFirst(node);}step 6:删除链表尾需要断掉尾节点前的连接,同时哈希表中去掉这个key值。void removeLast(){ //哈希表去掉key mp.remove(tail.pre.key); //断连该节点 tail.pre.pre.next = tail; tail.pre = tail.pre.pre;}step 7:如果是get操作,检验哈希表中有无这个key值,如果没有说明链表中也没有,返回-1,否则可以根据哈希表直接锁定链表中的位置进行访问,然后重复step 5,访问过的节点加入表头。if(mp.containsKey(key)){ Node node = mp.get(key); res = node.val; moveToHead(node);}图示:Java代码实现:import java.util.*;public class Solution { //设置双向链表结构 static class Node{ int key; int val; Node pre; Node next; //初始化 public Node(int key, int val) { this.key = key; this.val = val; this.pre = null; this.next = null; } } //哈希表 private Map<Integer, Node> mp = new HashMap<>(); //设置一个头 private Node head = new Node(-1, -1); //设置一个尾 private Node tail = new Node(-1, -1); private int size = 0; public int[] LRU (int[][] operators, int k) { //构建初始化连接 //链表剩余大小 this.size = k; this.head.next = this.tail; this.tail.pre = this.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操作 set(operators[i][1], operators[i][2]); else //get操作 res[j++] = get(operators[i][1]); } return res; } //插入函数 private void set(int key, int val){ //没有见过这个key,新值加入 if(!mp.containsKey(key)){ Node node = new Node(key, val); mp.put(key, node); //超出大小,移除最后一个 if(size <= 0) removeLast(); //大小还有剩余 else //大小减1 size--; //加到链表头 insertFirst(node); } //哈希表中已经有了,即链表里也已经有了 else{ mp.get(key).val = val; //访问过后,移到表头 moveToHead(mp.get(key)); } } //获取数据函数 private int get(int key){ int res = -1; if(mp.containsKey(key)){ Node node = mp.get(key); res = node.val; moveToHead(node); } return res; } //移到表头函数 private void moveToHead(Node node){ //已经到了表头 if(node.pre == head) return; //将节点断开,取出来 node.pre.next = node.next; node.next.pre = node.pre; //插入第一个前面 insertFirst(node); } //将节点插入表头函数 private void insertFirst(Node node){ node.pre = head; node.next = head.next; head.next.pre = node; head.next = node; } //删去表尾函数,最近最少使用 private void removeLast(){ //哈希表去掉key mp.remove(tail.pre.key); //断连该节点 tail.pre.pre.next = tail; tail.pre = tail.pre.pre; }}
点赞 0
评论 0
全部评论
推荐
最新
楼层
暂无评论,快来抢首评~
相关推荐
03-28 13:21
腾讯_Android客户端开发
转转 安卓 一面
自我介绍快手实习中逆向反编译抖音源码使用了哪些工具?具体流程是什么?逆向过程中是否遇到过加壳的应用?APP 加固的常见手段有哪些?如何破解 360 加固等市面上的加固方案?网络破解抖音证书校验不通过的具体实现步骤是什么?操作是在 Root 手机还是模拟器上进行的?抖音 APP 是否有风险检测机制?智能音量调节需求的具体实现逻辑是什么?传感器数据与分贝值的关联是如何应用的?低端机性能测试的场景和具体操作是什么?如何根据性能分析报告给出优化策略?扁鹊 SDK 和 KeyPop 平台的实现原理是什么?两者如何通信?你认为自己在安卓和 Java 后端方面,哪部分能力更强?为什么?Redis 和 MyS...
安卓客户端—...
点赞
评论
收藏
分享
03-29 09:03
北京大学 Java
深圳程序员职业生涯
2016年大学本科毕业之后没有从事自己想要的工作选择。上海的工作并没有得到认可。年轻人是时代的弄潮儿。时尚和美观操控着每个应届毕业生的不服输心态。测试题目的检测开始好转并得到面试官技术认可。学校大学本科校招时间窗口期很多的知名公司会进入一些名校高等学府进行校园招聘。宣讲会听讲认真但是并没有发现什么长处。呆呆的看着大学生打篮球有的时候 完美世界 的宣讲会就没有再次参与。专业实习的笔试成绩前端技术勉强通过面试官的技术标准。不理想的笔试成绩很有可能会拦着大部分面试官。甲骨文Oracle公司的笔试成绩7分表示这方面可能并不弱。 突然要离开大学回到南方。无法释怀的是一些外国大学留学生的抛掷过来的奇怪眼...
Java技术
点赞
评论
收藏
分享
03-30 15:50
暨南大学
字节-CrossPlatform-二面凉经
耗时30min最速解决拷打🐭的bg跟开发离得有点远了,cv上也全是玩具项目,纯纯是被好心HR捞到这个岗的(Lynx开发)假设有A->B->C三个继承对象,在析构时顺序是怎样的 (不会,瞎答)假设有进程A和进程B,如果同时使用一个数据对象,此时引用计数在进程B中归零,但是仍然希望这个对象只能在A中销毁怎么办(依旧不会,pass)平时用过智能指针吗,是怎么使用的用过Electron吗,介绍一下Electron,为什么直接用Electron而不直接用Webview(依旧瞎答)有尝试过多线程开发吗,该如何实现多线程熟悉React吗,React的原理知道吗()假设我有一个React组件,这...
查看10道真题和解析
点赞
评论
收藏
分享
评论
点赞成功,聊一聊 >
点赞
收藏
分享
评论
提到的真题
返回内容
全站热榜
更多
1
...
Vibe Coding开发前的 7 个关键步骤
1.3W
2
...
笔试做完两周没动静,我查了进度才知道不是挂了
4715
3
...
AIcoding上线了!你确定不来刷刷?
4232
4
...
4.1 美团后端暑期实习面经
3749
5
...
我放弃互联网大厂了。。
3642
6
...
必看实用VibeCoding项目
3018
7
...
腾讯前端暑期实习一面
2868
8
...
美团后端暑期实习一面
2857
9
...
如何把面试主动权握在手里?Ai岗面试焚诀!
2770
10
...
京东零售平台产品与研发中心一面
2659
创作者周榜
更多
正在热议
更多
#
你觉得大几开始实习最合适?
#
15358次浏览
173人参与
#
uu们,春招你还来吗?
#
52734次浏览
306人参与
#
开放七大实习专项,百度暑期实习值得冲吗
#
35455次浏览
616人参与
#
面试被问到不会的问题,你怎么应对?
#
12812次浏览
164人参与
#
面试中,你被问过哪些奇葩问题?
#
92292次浏览
892人参与
#
Claude Code泄露源码
#
7244次浏览
111人参与
#
厦门银行科技岗值不值得投
#
13783次浏览
311人参与
#
恒生电子笔试
#
17554次浏览
135人参与
#
2023年不发年终奖的公司盘点
#
30304次浏览
174人参与
#
你都用vibe coding做过什么?
#
9340次浏览
388人参与
#
AI Coding实战技巧
#
7897次浏览
174人参与
#
26届春招投递记录
#
1502次浏览
24人参与
#
你现在一天AI几次?
#
6603次浏览
87人参与
#
七猫笔试
#
6359次浏览
46人参与
#
做完笔试后你收到面试了吗?
#
14336次浏览
165人参与
#
四大天坑是哪四家?
#
111187次浏览
241人参与
#
你见过哪些招聘隐形歧视?
#
11121次浏览
98人参与
#
机械人你知道哪些单休企业
#
101824次浏览
476人参与
#
Vibe Coding 会干掉初级岗位吗?
#
12373次浏览
168人参与
#
大厂实习和小厂实习最大的区别是什么?
#
25217次浏览
194人参与
#
如果人生可以debug你会改哪一行?
#
5686次浏览
102人参与
#
网易游戏雷火笔试
#
4004次浏览
66人参与
牛客网
牛客网在线编程
牛客网题解
牛客企业服务