问题: LRU缓存机制
运用你所掌握的数据结构,设计和实现一个 LRU (最近最少使用) 缓存机制。它应该支持以下操作: 获取数据 get 和 写入数据 put 。

获取数据 get(key) - 如果密钥 (key) 存在于缓存中,则获取密钥的值(总是正数),否则返回 -1。
写入数据 put(key, value) - 如果密钥已经存在,则变更其数据值;如果密钥不存在,则插入该组「密钥/数据值」。当缓存容量达到上限时,它应该在写入新数据之前删除最久未使用的数据值,从而为新的数据值留出空间。进阶:
你是否可以在 O(1) 时间复杂度内完成这两种操作?

示例:

LRUCache cache = new LRUCache( 2 /* 缓存容量 */ );

cache.put(1, 1);
cache.put(2, 2);
cache.get(1); // 返回 1
cache.put(3, 3); // 该操作会使得密钥 2 作废
cache.get(2); // 返回 -1 (未找到)
cache.put(4, 4); // 该操作会使得密钥 1 作废
cache.get(1); // 返回 -1 (未找到)
cache.get(3); // 返回 3
cache.get(4); // 返回 4

代码:

  1. package test;
  2.  
  3. import java.util.ArrayList;
  4. import java.util.Iterator;
  5. import java.util.List;
  6.  
  7. class ChItem{
  8. public ChItem(int key,int value) {
  9. this.key=key;
  10. this.value=value;
  11. }
  12.  
  13. int key;
  14. int value;
  15. }
  16. public class LruCache2 {
  17. private List<ChItem> dataList;
  18. private int size;
  19.  
  20. public LruCache2(int capacity) {
  21. this.size=capacity;
  22. dataList = new ArrayList<ChItem>();
  23. }
  24.  
  25. public int get(int key) {
  26. int retval=-1;
  27.  
  28. Iterator<ChItem> iterator = dataList.iterator();
  29. while(iterator.hasNext()) {
  30. ChItem item=iterator.next();
  31.  
  32. if(item.key==key) {
  33. retval=item.value;
  34. dataList.remove(item);
  35. break;
  36. }
  37. }
  38.  
  39. if(retval!=-1) {
  40. dataList.add(0, new ChItem(key,retval));
  41. }
  42.  
  43. return retval;
  44. }
  45.  
  46. public void put(int key,int value) {
  47. if(dataList.size()>=this.size) {
  48. dataList.remove(dataList.size()-1);
  49. }
  50.  
  51. dataList.add(0, new ChItem(key,value));
  52. }
  53.  
  54. public void print() {
  55. StringBuilder sb=new StringBuilder();
  56. sb.append("[");
  57.  
  58. for(ChItem item:dataList) {
  59. sb.append("("+item.key+","+item.value+"),");
  60. }
  61.  
  62. sb.append("]");
  63. System.out.print(sb.toString());
  64. }
  65.  
  66. public static void main(String[] args) throws Exception{
  67. LruCache2 cache=new LruCache2(2);
  68. cache.put(1,1);
  69. System.out.print(".....");
  70. cache.print();
  71. System.out.println();
  72.  
  73. cache.put(2,2);
  74. System.out.print(".....");
  75. cache.print();
  76. System.out.println();
  77.  
  78. System.out.print(cache.get(1));
  79. System.out.print(".....");
  80. cache.print();
  81. System.out.println();
  82.  
  83. cache.put(3, 3);
  84. System.out.print(".....");
  85. cache.print();
  86. System.out.println();
  87.  
  88. System.out.print(cache.get(2));
  89. System.out.print(".....");
  90. cache.print();
  91. System.out.println();
  92.  
  93. cache.put(4, 4);
  94. System.out.print(".....");
  95. cache.print();
  96. System.out.println();
  97.  
  98. System.out.print(cache.get(1));
  99. System.out.print(".....");
  100. cache.print();
  101. System.out.println();
  102.  
  103. System.out.print(cache.get(3));
  104. System.out.print(".....");
  105. cache.print();
  106. System.out.println();
  107.  
  108. System.out.print(cache.get(4));
  109. System.out.print(".....");
  110. cache.print();
  111. System.out.println();
  112. }
  113. }

输出:

  1. .....[(1,1),]
  2. .....[(2,2),(1,1),]
  3. 1.....[(1,1),(2,2),]
  4. .....[(3,3),(1,1),]
  5. -1.....[(3,3),(1,1),]
  6. .....[(4,4),(3,3),]
  7. -1.....[(4,4),(3,3),]
  8. 3.....[(3,3),(4,4),]
  9. 4.....[(4,4),(3,3),]

--2020年5月10日 19点47分--

Q200510-03-02: LRU缓存机制的更多相关文章

  1. [Leetcode]146.LRU缓存机制

    Leetcode难题,题目为: 运用你所掌握的数据结构,设计和实现一个  LRU (最近最少使用) 缓存机制.它应该支持以下操作: 获取数据 get 和 写入数据 put . 获取数据 get(key ...

  2. Java实现 LeetCode 146 LRU缓存机制

    146. LRU缓存机制 运用你所掌握的数据结构,设计和实现一个 LRU (最近最少使用) 缓存机制.它应该支持以下操作: 获取数据 get 和 写入数据 put . 获取数据 get(key) - ...

  3. 常见面试题之操作系统中的LRU缓存机制实现

    LRU缓存机制,全称Least Recently Used,字面意思就是最近最少使用,是一种缓存淘汰策略.换句话说,LRU机制就是认为最近使用的数据是有用的,很久没用过的数据是无用的,当内存满了就优先 ...

  4. Q200510-03-03 :LRU缓存机制

    LRU缓存机制运用你所掌握的数据结构,设计和实现一个 LRU (最近最少使用) 缓存机制.它应该支持以下操作: 获取数据 get 和 写入数据 put . 获取数据 get(key) - 如果密钥 ( ...

  5. 力扣 - 146. LRU缓存机制

    目录 题目 思路 代码 复杂度分析 题目 146. LRU缓存机制 思路 利用双链表和HashMap来解题 看到链表题目,我们可以使用头尾结点可以更好进行链表操作和边界判断等 还需要使用size变量来 ...

  6. 146. LRU 缓存机制 + 哈希表 + 自定义双向链表

    146. LRU 缓存机制 LeetCode-146 题目描述 题解分析 java代码 package com.walegarrett.interview; /** * @Author WaleGar ...

  7. 【golang必备算法】 Letecode 146. LRU 缓存机制

    力扣链接:146. LRU 缓存机制 思路:哈希表 + 双向链表 为什么必须要用双向链表? 因为我们需要删除操作.删除一个节点不光要得到该节点本身的指针,也需要操作其前驱节点的指针,而双向链表才能支持 ...

  8. 【力扣】146. LRU缓存机制

    运用你所掌握的数据结构,设计和实现一个  LRU (最近最少使用) 缓存机制.它应该支持以下操作: 获取数据 get 和 写入数据 put . 获取数据 get(key) - 如果关键字 (key) ...

  9. [Swift]LeetCode146. LRU缓存机制 | LRU Cache

    Design and implement a data structure for Least Recently Used (LRU) cache. It should support the fol ...

随机推荐

  1. Spring Cloud 之 基础学习资料

    通过调研发现,官方及国内基础学习资料已经比较完善,故不再重复赘述,安静地做个搬运工. 如工作中遇到比较复杂或重要的点,再做详述. 官方 Spring 官方入门系列 服务注册与发现 Service Re ...

  2. 强开企业付款到零钱与现金红包,无需等待90/30天,2-12H即可强开通!

    一.微信官方给出的,企业付款到零钱|现金红包开通的说明 针对入账方式为即时入账至商户号,结算周期为T+1的商户,需满足三个条件:1)入驻满90天,2)连续正常交易30天,3)保持正常健康交易.其余结算 ...

  3. 【Java】JavaMail 554错误解决方法

    一.解决连续发送多次 // 构件MimeMessage 对象,并设置在发送给收信人之前给自己(发送方)抄送一份 MimeMessage msg = mailSender.createMimeMessa ...

  4. Newbe.Claptrap 框架如何实现 Claptrap 的多样性?

    Newbe.Claptrap 框架如何实现 Claptrap 的多样性?最近整理了一下项目的术语表.今天就谈谈什么是 Claptrap Design 和 Claptrap Factory. 特别感谢  ...

  5. vue跳转页面问题记录

    跳转到别的页面带参数 const space = this.pageHelperspace['search'] = this.searchconst query_params = Object.ass ...

  6. 洛谷P1149.火柴棒等式(暴力搜索)

    题目描述 给你n根火柴棍,你可以拼出多少个形如"A+B=C"的等式?等式中的A.B.C是用火柴棍拼出的整数(若该数非零,则最高位不能是0).用火柴棍拼数字0-9的拼法如图所示: 注 ...

  7. utf-8变长

    utf-8变长 变长规则 一字节:0******* 两字节:110,10* 三字节:1110,10,10**** 四字节:11110**,10******,10,10* 如果是以0开头的,那么他就是一 ...

  8. jsp环境搭建及入门

    配置环境: 此处配置完成后startup.bat闪退,修改端口号重启后恢复正常 常见状态码: 200:一切正常 300/301:页面重定向(跳转) 404:资源不存在 403:权限不足(例如:访问a目 ...

  9. Java之NIO与IO比较分析

    Java NIO(New Input/Output)——新的输入/输出API包——是2002年引入到J2SE 1.4里的.Java NIO的目标是提高Java平台上的I/O密集型任务的性能. 简单描述 ...

  10. META.表

    META.表