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

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. 配置Django-TinyMCE组件支持上传图片功能

    Django自带的Admin后台,好用,TinyMCE作为富文本编辑器,也蛮好用的,这两者结合起来在做博客的时候很方便(当然博客可能更适合用Markdown来写),但是Django-TinyMCE这个 ...

  2. 微信公众号添加word文件

    微信公众号添加word文件的教程 我们都知道创建一个微信公众号,在公众号中发布一些文章是非常简单的,但公众号添加附件下载的功能却被限制,如今可以使用小程序“微附件”进行在公众号中添加附件. 以下是公众 ...

  3. 攻防世界-web(进阶)-Training-WWW-Robots

    进行后台扫描,发现一个robots.txt,进入之后说存在fl0g.php,进入即可得flag. cyberpeace{73279bc0d3c28ba6da4d1d3d530e7c16}

  4. 题解 洛谷 P3332

    题目描述 权值线段树套线段树板子题 首先观察题目,判断为二维偏序问题 操作1为区间修改,所以一定是外部线段树维护权值,内部线段树维护所在区间,否则时间复杂度爆炸qwq 为方便查找,哈希时我采用哈希每个 ...

  5. 【POJ2728】Desert King - 01分数规划

    Description David the Great has just become the king of a desert country. To win the respect of his ...

  6. sizeof的用法 2007-12-19 11:06

    sizeof的作用是什么?sizeof是C/C++中的一个操作符(operator),简单的说其作用就是返回一个对象或者类型所占的内存字节数.其返回值类型为size_t,在头文件stddef.h中定义 ...

  7. 哲思集-转载自CSDN

    CSDN 创始人蒋涛:世界被编码之后 分享赚¥9.90订阅博主 “写代码 20 年,通过网络平台和社区,帮助中国的程序员更好成长,这是我最希望被大家记住的.”这是蒋涛接受 ZAKER 采访的开场白. ...

  8. 关于MapReduce默认分区策略

    MapReduce默认分区策略 mapreduce 默认的分区方式是hashPartition,在这种分区方式下,KV对根据key的hashcode值与reduceTask个数进行取模,决定该键值对该 ...

  9. Java成员变量和局部变量的区别

    定义位置不同: 成员变量:类中方法外 分为类变量(static修饰).实例变量(没有使用static修饰) 局部变量:方法内.代码块内 默认值不同: 成员变量:有默认初始化值 局部变量:没有默认初始化 ...

  10. 安装pyspider报错:ERROR: Complete output from command python setup.py egg_info:...

    正在学习pyspider框架,安装过程并不顺利,随即百度了一下解决了问题,将解决方法记录备用 问题描述: 首先出现  pip版本低,根据提示升级即可 再次安装报错如下 解决过程: 第一步:首先安装wh ...