问题: 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

代码:

package test;

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List; class ChItem{
public ChItem(int key,int value) {
this.key=key;
this.value=value;
} int key;
int value;
}
public class LruCache2 {
private List<ChItem> dataList;
private int size; public LruCache2(int capacity) {
this.size=capacity;
dataList = new ArrayList<ChItem>();
} public int get(int key) {
int retval=-1; Iterator<ChItem> iterator = dataList.iterator();
while(iterator.hasNext()) {
ChItem item=iterator.next(); if(item.key==key) {
retval=item.value;
dataList.remove(item);
break;
}
} if(retval!=-1) {
dataList.add(0, new ChItem(key,retval));
} return retval;
} public void put(int key,int value) {
if(dataList.size()>=this.size) {
dataList.remove(dataList.size()-1);
} dataList.add(0, new ChItem(key,value));
} public void print() {
StringBuilder sb=new StringBuilder();
sb.append("["); for(ChItem item:dataList) {
sb.append("("+item.key+","+item.value+"),");
} sb.append("]");
System.out.print(sb.toString());
} public static void main(String[] args) throws Exception{
LruCache2 cache=new LruCache2(2);
cache.put(1,1);
System.out.print(".....");
cache.print();
System.out.println(); cache.put(2,2);
System.out.print(".....");
cache.print();
System.out.println(); System.out.print(cache.get(1));
System.out.print(".....");
cache.print();
System.out.println(); cache.put(3, 3);
System.out.print(".....");
cache.print();
System.out.println(); System.out.print(cache.get(2));
System.out.print(".....");
cache.print();
System.out.println(); cache.put(4, 4);
System.out.print(".....");
cache.print();
System.out.println(); System.out.print(cache.get(1));
System.out.print(".....");
cache.print();
System.out.println(); System.out.print(cache.get(3));
System.out.print(".....");
cache.print();
System.out.println(); System.out.print(cache.get(4));
System.out.print(".....");
cache.print();
System.out.println();
}
}

输出:

.....[(1,1),]
.....[(2,2),(1,1),]
1.....[(1,1),(2,2),]
.....[(3,3),(1,1),]
-1.....[(3,3),(1,1),]
.....[(4,4),(3,3),]
-1.....[(4,4),(3,3),]
3.....[(3,3),(4,4),]
4.....[(4,4),(3,3),]

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

最新文章

  1. 速算1/Sqrt(x)背后的数学原理
  2. TCP发消息续传文件
  3. 如何在win7系统中安装redis
  4. demo
  5. 【BZOJ-3144】切糕 最小割-最大流
  6. Lock锁
  7. 关于解决pyinstaller2.1将.py打包成exe文件在中文目录下不能执行的问题
  8. How does browsersync work?
  9. Hadoop学习---安装部署
  10. 使用sql语句创建表、修改表、添加列等
  11. CentOS 搭建git服务
  12. tensorflow models api:ValueError: Tensor conversion requested dtype string for Tensor with dtype float32: &#39;Tensor(&quot;arg0:0&quot;, shape=(), dtype=float32, device=/device:CPU:0)&#39;
  13. matplotlib绘图不显示问题解决plt.show()
  14. AI mac安装TensorFlow
  15. spark sql中将数据保存成parquet,json格式
  16. [COGS257]动态排名系统 树状数组套主席树
  17. ssh登录很慢的问题
  18. 深入理解 flex 布局以及计算_Flexbox, Layout
  19. @Resource 注解的作用【和 @Autowired 的对比】
  20. HDU 2066 一个人的旅行(dijkstra水题+判重边)

热门文章

  1. 安装Scrapy的时候报错error: Microsoft Visual C++ 14.0 is required.
  2. 解决drf_yasg中的SwaggerAPI无法正确分组问题
  3. Dubbo整合Springboot框架
  4. [机器学习 ]PCA降维--两种实现 : SVD或EVD. 强力总结. 在鸢尾花数据集(iris)实做
  5. C#LeetCode刷题之#101-对称二叉树(Symmetric Tree)
  6. LeetCode 91,点赞和反对五五开,这题是好是坏由你来评判
  7. 【ASP.NET Core学习】使用JWT认证授权
  8. python对端口进行扫描
  9. DB2根据报错代码查看表与字段信息
  10. G4560 HD610安装黑苹果Hakintosh