题目描述

设计LRU缓存结构,该结构在构造时确定大小,假设大小为K,并有如下两个功能

  • set(key, value):将记录(key, value)插入该结构
  • get(key):返回key对应的value值

[要求]

  1. set和get方法的时间复杂度为O(1)
  2. 某个key的set或get操作一旦发生,认为这个key的记录成了最常使用的。
  3. 当缓存的大小超过K时,移除最不经常使用的记录,即set或get最久远的。

若opt=1,接下来两个整数x, y,表示set(x, y)
若opt=2,接下来一个整数x,表示get(x),若x未出现过或已被移除,则返回-1
对于每个操作2,输出一个答案

示例1

输入

[[1,1,1],[1,2,2],[1,3,2],[2,1],[1,4,4],[2,2]],3

返回值

[1,-1]

说明

第一次操作后:最常使用的记录为("1", 1)
第二次操作后:最常使用的记录为("2", 2),("1", 1)变为最不常用的
第三次操作后:最常使用的记录为("3", 2),("1", 1)还是最不常用的
第四次操作后:最常用的记录为("1", 1),("2", 2)变为最不常用的
第五次操作后:大小超过了3,所以移除此时最不常使用的记录("2", 2),加入记录("4", 4),并且为最常使用的记录,然后("3", 2)变为最不常使用的记录
import java.util.*;public class TestLRU {public static void main(String[] args) {// [[1,1,1],[1,2,2],[1,3,2],[2,1],[1,4,4],[2,2]],3int [][] data = new int[][]{{1,1,1},{1,2,2},{1,3,2},{2,1},{1,4,4},{2,2}};TestLRU testLRU = new TestLRU();int [] result = testLRU.LRU(data,3);System.out.println(Arrays.toString(result));}/*** lru design* @param operators int整型二维数组 the ops* @param k int整型 the k* @return int整型一维数组*/public int[] LRU (int[][] operators, int k) {LinkedHashMap<Integer,Integer> lruM = new LinkedHashMap<>();List<Integer> restList = new ArrayList<Integer>();for(int[] operator : operators){switch(operator[0]){case 1:if(lruM.size() >= k){// 缓存已经存满// 当缓存的大小超过K时,移除最不经常使用的记录,即set或get最久远的。Iterator<Integer> iterator = lruM.keySet().iterator();lruM.remove(iterator.next());lruM.put(operator[1],operator[2]);}else{lruM.put(operator[1],operator[2]);}break;case 2:if(!lruM.isEmpty() && lruM.containsKey(operator[1])){// 某个key的set或get操作一旦发生,认为这个key的记录成了最常使用的Integer value = lruM.get(operator[1]);lruM.remove(operator[1]);lruM.put(operator[1],value); // 设置为最新restList.add(value);}else{restList.add(-1);}break;}}int[] resutArr = new int[restList.size()];int i = 0;for(Integer value : restList){resutArr[i++] = value;}return resutArr;}}

常考数据结构和算法:设计LRU缓存结构相关推荐

  1. 常考数据结构与算法:设计getMin功能的栈

    题目描述 实现一个特殊功能的栈,在实现栈的基本功能的基础上,再实现返回栈中最小元素的操作. 示例1 输入 [[1,3],[1,2],[1,1],[3],[2],[3]] 返回值 [1,2] 备注: 有 ...

  2. 常考数据结构与算法:输出二叉树的右视图

    题目描述 请根据二叉树的前序遍历,中序遍历恢复二叉树,并打印出二叉树的右视图 上图树的右视图为:{1,4,3,7} 做此题之前可以先做下面3道题: 1. 常考数据结构与算法:求二叉树的层序遍历 2.常 ...

  3. 常考数据结构与算法:求二叉树的层序遍历

    题目描述 给定一个二叉树,返回该二叉树层序遍历的结果,(从左到右,一层一层地遍历) 例如: 给定的二叉树是{3,9,20,#,#,15,7}, 该二叉树层序遍历的结果是 [ [3], [9,20], ...

  4. 【牛客 - NC93】设计LRU缓存结构(模拟)

    设计LRU缓存结构_牛客题霸_牛客网 描述 设计LRU(最近最少使用)缓存结构,该结构在构造时确定大小,假设大小为 k ,并有如下两个功能 1. set(key, value):将记录(key, va ...

  5. 常考数据结构与算法:买卖股票的最好时机

    题目描述 假设你有一个数组,其中第 i 个元素是股票在第i 天的价格. 你有一次买入和卖出的机会.(只有买入了股票以后才能卖出).请你设计一个算法来计算可以获得的最大收益. 示例 1: 输入: [8, ...

  6. 常考数据结构与算法:删除链表的倒数第n个节点

    题目描述 给定一个链表,删除链表的倒数第n个节点并返回链表的头指针 例如, 给出的链表为:1->2->3->4->5, n= 2.删除了链表的倒数第n个节点之后,链表变为1-& ...

  7. 常考数据结构与算法:找到字符串的最长无重复字符子串

    题目描述 给定一个数组arr,返回arr的最长无的重复子串的长度(无重复指的是所有数字都不相同). 示例1 输入 [2,3,4,5] 返回值 4 示例2 输入 [2,2,3,4,3] 返回值 3 方法 ...

  8. 常考数据结构与算法:最长公共子串

    题目描述 给定两个字符串str1和str2,输出两个字符串的最长公共子串 题目保证str1和str2的最长公共子串存在且唯一. 示例1 输入 "1AB2345CD","1 ...

  9. 常考数据结构与算法:两个链表生成相加链表

    题目描述 假设链表中每一个节点的值都在 0 - 9 之间,那么链表整体就可以代表一个整数. 给定两个这种链表,请生成代表两个整数相加值的结果链表. 例如:链表 1 为 9->3->7,链表 ...

最新文章

  1. MLNLP顶会论文发表总榜:谷歌最狂,清北入前十,周明、张岳、刘挺华人前三...
  2. RxJava/RxAndroid:timer(long delay, TimeUnit unit)
  3. html部分位置属性
  4. 编写一程序,输入一个字符串,查找该字符串中是否包含“abc”。
  5. linux yum命令作用,YUM命令使用示例
  6. postman自动打开_postman---postman自动发博客
  7. 网页中调用Google地图
  8. 区块链优秀github开源项目
  9. 三星智能电视将用户语音隐私泄露给第三方?
  10. php中ASCⅡ码的妙用
  11. wegame每次登陆都要滑动验证_wegame登录验证码白屏
  12. ASP.NET20003人事薪资管理系统
  13. 【动态规划】黑熊过河
  14. 什么是友情链接?友情链接的好处及写法(图文)
  15. 技术团队培养_如何在团队中培养伟大的文化
  16. 如何免费使用jrebel 和eclipse 项目配合完成热部署功能
  17. 充电口 米兔积木机器人_米兔积木机器人怎么充电
  18. 资深运维也不知道的那些事
  19. 基于lora模块智能井盖解决方案
  20. 语音数据标注工具与平台/公司

热门文章

  1. bzoj 4711 小奇挖矿 ——“承诺”类树形dp
  2. ROS与Arduino学习(三)订阅与发布
  3. bzoj1513【POI2006】Tet-Tetris 3D
  4. 关于Linux 是怎么来的,该如何去学
  5. 迭代开发个人总结20160702
  6. 静态程序分析chapter5 - 常量传播分析上(Costant Propagation Analysis)
  7. AAAI 2019 | 借鉴传染病学原理探索医学图像CNN可解释性
  8. 2018-2019-1 20189218《Linux内核原理与分析》第五周作业
  9. apigateway-kong(四)负载均衡理论及实现
  10. 学习《Flask Web开发:基于Python的Web应用开发实战》分享