Q200510-03-02: LRU缓存机制
问题: 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缓存机制的更多相关文章
- [Leetcode]146.LRU缓存机制
Leetcode难题,题目为: 运用你所掌握的数据结构,设计和实现一个 LRU (最近最少使用) 缓存机制.它应该支持以下操作: 获取数据 get 和 写入数据 put . 获取数据 get(key ...
- Java实现 LeetCode 146 LRU缓存机制
146. LRU缓存机制 运用你所掌握的数据结构,设计和实现一个 LRU (最近最少使用) 缓存机制.它应该支持以下操作: 获取数据 get 和 写入数据 put . 获取数据 get(key) - ...
- 常见面试题之操作系统中的LRU缓存机制实现
LRU缓存机制,全称Least Recently Used,字面意思就是最近最少使用,是一种缓存淘汰策略.换句话说,LRU机制就是认为最近使用的数据是有用的,很久没用过的数据是无用的,当内存满了就优先 ...
- Q200510-03-03 :LRU缓存机制
LRU缓存机制运用你所掌握的数据结构,设计和实现一个 LRU (最近最少使用) 缓存机制.它应该支持以下操作: 获取数据 get 和 写入数据 put . 获取数据 get(key) - 如果密钥 ( ...
- 力扣 - 146. LRU缓存机制
目录 题目 思路 代码 复杂度分析 题目 146. LRU缓存机制 思路 利用双链表和HashMap来解题 看到链表题目,我们可以使用头尾结点可以更好进行链表操作和边界判断等 还需要使用size变量来 ...
- 146. LRU 缓存机制 + 哈希表 + 自定义双向链表
146. LRU 缓存机制 LeetCode-146 题目描述 题解分析 java代码 package com.walegarrett.interview; /** * @Author WaleGar ...
- 【golang必备算法】 Letecode 146. LRU 缓存机制
力扣链接:146. LRU 缓存机制 思路:哈希表 + 双向链表 为什么必须要用双向链表? 因为我们需要删除操作.删除一个节点不光要得到该节点本身的指针,也需要操作其前驱节点的指针,而双向链表才能支持 ...
- 【力扣】146. LRU缓存机制
运用你所掌握的数据结构,设计和实现一个 LRU (最近最少使用) 缓存机制.它应该支持以下操作: 获取数据 get 和 写入数据 put . 获取数据 get(key) - 如果关键字 (key) ...
- [Swift]LeetCode146. LRU缓存机制 | LRU Cache
Design and implement a data structure for Least Recently Used (LRU) cache. It should support the fol ...
随机推荐
- Spring Cloud 之 基础学习资料
通过调研发现,官方及国内基础学习资料已经比较完善,故不再重复赘述,安静地做个搬运工. 如工作中遇到比较复杂或重要的点,再做详述. 官方 Spring 官方入门系列 服务注册与发现 Service Re ...
- 强开企业付款到零钱与现金红包,无需等待90/30天,2-12H即可强开通!
一.微信官方给出的,企业付款到零钱|现金红包开通的说明 针对入账方式为即时入账至商户号,结算周期为T+1的商户,需满足三个条件:1)入驻满90天,2)连续正常交易30天,3)保持正常健康交易.其余结算 ...
- 【Java】JavaMail 554错误解决方法
一.解决连续发送多次 // 构件MimeMessage 对象,并设置在发送给收信人之前给自己(发送方)抄送一份 MimeMessage msg = mailSender.createMimeMessa ...
- Newbe.Claptrap 框架如何实现 Claptrap 的多样性?
Newbe.Claptrap 框架如何实现 Claptrap 的多样性?最近整理了一下项目的术语表.今天就谈谈什么是 Claptrap Design 和 Claptrap Factory. 特别感谢 ...
- vue跳转页面问题记录
跳转到别的页面带参数 const space = this.pageHelperspace['search'] = this.searchconst query_params = Object.ass ...
- 洛谷P1149.火柴棒等式(暴力搜索)
题目描述 给你n根火柴棍,你可以拼出多少个形如"A+B=C"的等式?等式中的A.B.C是用火柴棍拼出的整数(若该数非零,则最高位不能是0).用火柴棍拼数字0-9的拼法如图所示: 注 ...
- utf-8变长
utf-8变长 变长规则 一字节:0******* 两字节:110,10* 三字节:1110,10,10**** 四字节:11110**,10******,10,10* 如果是以0开头的,那么他就是一 ...
- jsp环境搭建及入门
配置环境: 此处配置完成后startup.bat闪退,修改端口号重启后恢复正常 常见状态码: 200:一切正常 300/301:页面重定向(跳转) 404:资源不存在 403:权限不足(例如:访问a目 ...
- Java之NIO与IO比较分析
Java NIO(New Input/Output)——新的输入/输出API包——是2002年引入到J2SE 1.4里的.Java NIO的目标是提高Java平台上的I/O密集型任务的性能. 简单描述 ...
- META.表
META.表