package com.heu.wsq.niuke.top200;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
* 设计LRU缓存结构
* @author wsq
* @date 2021/5/8
* 设计LRU缓存结构,该结构在构造时确定大小,假设大小为K,并有如下两个功能
* set(key, value):将记录(key, value)插入该结构
* get(key):返回key对应的value值
* [要求]
* set和get方法的时间复杂度为O(1)
* 某个key的set或get操作一旦发生,认为这个key的记录成了最常使用的。 当缓存的大小超过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]
*/
public class LRU {
public int[] LRU (int[][] operators, int k) {
// write code here
List<Integer> list = new ArrayList<>();
LRUCache lruCache = new LRUCache(k);
for(int[] op: operators){
if(op[0] == 1){
lruCache.set(op[1], op[2]);
}else if(op[0] == 2){
list.add(lruCache.get(op[1]));
}
}
int[] ans = new int[list.size()];
for(int i = 0; i < list.size(); i++){
ans[i] = list.get(i);
}
return ans;
}
}
class LRUCache{
/**
* 双向链表
*/
class LinkedNode{
private int key;
private int value;
private LinkedNode prev;
private LinkedNode next;
public LinkedNode(){}
public LinkedNode(int key, int value){
this.key = key;
this.value = value;
}
}
/**
* 保存头尾节点的指针,以便于在O(1)时间内进行去除链表尾,和新增节点到链表头
*/
private LinkedNode head;
private LinkedNode tail;
/**
* 保存key与node的映射,作为缓存表
*/
private Map<Integer, LinkedNode> cache;
/**
* 定义缓存表的容量
*/
private int capacity;
public LRUCache(int k){
this.cache = new HashMap<>();
this.capacity = k;
this.head = new LinkedNode();
this.tail = new LinkedNode();
this.head.next = this.tail;
this.tail.prev = this.head;
}
/**
* 添加节点到缓存中
* 1.当缓存中没有对应的记录信息,则新建一个节点保存到缓存中,并将对应的节点放置到链表的头部
* 2.当缓存中有对应的记录信息,更新记录节点的value,,并将该记录节点更新到链表的头部,表示该记录最近被使用
* @param k
* @param v
*/
public void set(int k, int v){
LinkedNode node = this.cache.get(k);
if(node == null){
node = new LinkedNode(k, v);
this.cache.put(k, node);
addToHead(node);
if(this.cache.size() > this.capacity){
LinkedNode tailNode = rmTailNode();
this.cache.remove(tailNode.key);
}
}else{
node.value = v;
rmNodeToHead(node);
}
}
/**
* 通过key获取缓存信息
* 并且需要更新该记录到链表的头部,表示该缓存记录最近被使用了
* @param k
* @return
*/
public int get(int k){
LinkedNode node = this.cache.get(k);
if(node != null){
rmNodeToHead(node);
}
return node == null ? -1 :node.value;
}
private void rmNodeToHead(LinkedNode node){
rmNode(node);
addToHead(node);
}
private void rmNode(LinkedNode node){
node.prev.next = node.next;
node.next.prev = node.prev;
}
private void addToHead(LinkedNode node){
node.next = this.head.next;
this.head.next = node;
node.prev = this.head;
node.next.prev = node;
}
private LinkedNode rmTailNode(){
LinkedNode node = this.tail.prev;
rmNode(node);
return node;
}
}
相关推荐
别再为CAD和GIS数据对不上而头疼了!一份完整的ArcGIS for AutoCAD坐标系定义与数据套合指南
本文详细介绍了如何通过ArcGIS for AutoCAD插件解决CAD与GIS数据坐标系不匹配的问题,实现数据的精准套合。文章从坐标系冲突分析、插件核心功能解析到五步标准化工作流,提供了完整的解决方案,帮助工程师和设计师提升跨平台协作效率。
每日一练之设计 LRU 缓存结构
设计 LRU 缓存结构 OJ 地址:设计 LRU 缓存结构 #include <unordered_map> class Solution { private: // 维护一个有序单向链表,当有一个新的数据被访问时,从链表头部开始遍历链表: // 1 如果此数据之前已经在缓存中了,那么将其从原来的位置删除,并将其插入到头节点 // 2 如果此数据之前不在缓存中: // 2.1 如果缓存未满,则直接将此节点插入到头节点 // 2.2 如果缓存已满
组合导航、惯导、GNSS、INS、IMU的区别
:惯性导航系统(INS)是一种利用安装在运载体上的陀螺仪和加速度计来测定运载体位置的系统。它通过测量物体的加速度和角速度,结合算法计算出物体的位置、速度和姿态12。。
牛客题解 | 设计LRU缓存结构
牛客题库题解
Voronoi算法构建多晶
孪晶多晶 采用孪晶的原子链作为种子通过voronoi算法可以得到孪晶多晶结构。 孪晶种子: txt文件不需要特殊设置 box 150 150 150 random 8 得到孪晶多晶: 通过改变孪晶种子的长度可以得到不同孪晶片层厚度的多晶。 准二维柱晶 所有晶粒在某一维度的晶向一致,晶粒仅在平面内具有旋转关系,所有晶界为旋转对称晶界,这种结构的多晶其位错滑移在某些方向受限,但是能极大的提高晶粒...
告别环境依赖!用PyInstaller把PaddleOCR项目打包成独立EXE(附完整spec文件配置)
本文详细介绍了如何使用PyInstaller将PaddleOCR项目打包成独立EXE文件,彻底解决Python环境依赖问题。通过完整的spec文件配置和实战技巧,开发者可以轻松创建开箱即用的OCR工具,特别适合需要交付给非技术用户的场景。文章涵盖环境配置、模型打包、性能优化等关键环节,并提供了解决常见问题的方案。
设计一个LRU缓存结构
题意 题解 #include <unordered_map> struct DListNode{ int key, val; DListNode* next; DListNode* pre; DListNode(int key, int value): key(key), val(val), pre(nullptr), next(nullptr){} }; class DList{ private: DListNode* head; DListN
【异常】解决 Claude Code 及第三方插件提示 “API Error: 404“ 的配置修复指南
在使用 Claude 相关的 CLI 工具(如)或 IDE 插件进行开发辅助时,配置错误的模型参数是导致连接失败的常见原因。本文将针对这一典型报错进行复盘与解决。
LRU缓存数据结构的设计
/ 该操作会使得关键字 2 作废,缓存是 {1=1, 3=3}std::cout << cache.get(1) << std::endl;// 缓存是 {1=1, 2=2}
电路中的DGND、GROUND、GROUND_REF的区别,VREF、VCC、VDD、VEE和VSS的区别?
DGND是数字地,是数字电路部分的公共基准端,用于连接数字电路的接地。
3 路由引入
在大型企业网络中,网络规模十分庞大,选用单一的路由协议无法满足网络的需求,因此多种路由协议共存的情况十分常见。或者出于业务逻辑或行政管理的考虑,会在不同的网络结构中设计和部署不同的路由协议,使路由的层次结构更加清晰可控。路由引入是具有方向性的,将路由信息从路由协议A引入到路由协议B(A-to-B),则路由协议B可获知A中的路由信息,但是此时,A还并不知晓B路由协议中的路由信息,除非配置B-to-A的路由引入。表3-1:各种路由协议的优先级。通过路由引入,可以实现路由信息在不同路由协议间传递。
【牛客】设计LRU缓存结构
题目描述 设计LRU缓存结构,该结构在构造时确定大小,假设大小为K,并有如下两个功能 set(key, value):将记录(key, value)插入该结构 get(key):返回key对应的value值 要求 set和get方法的时间复杂度为O(1) 某个key的set或get操作一旦发生,认为这个key的记录成了最常使用的。 当缓存的大小超过K时,移除最不经常使用的记录,即set或get最久远的。 若opt=1,接下来两个整数x, y,表示set(x, y) 若opt=2,接下来一个整数x
【人工智能之深度学习】15. 工业时序预测实战:LSTM与TCN融合的装备故障预警系统设计与实现
摘要:工业装备故障预警是智能制造领域的核心技术之一,其通过分析传感器时序数据实现故障提前预测,可显著降低运维成本并提升设备可靠性。本文针对工业时序数据多源异构、非平稳性、噪声干扰及样本不平衡等挑战,提出一种LSTM与TCN融合的故障预警架构——利用TCN捕捉局部时序特征,结合注意力增强LSTM建模长期依赖关系,通过门控机制实现特征自适应融合。以3MW风电齿轮箱为研究对象,设计包含数据预处理、特征工程、模型训练及部署的完整流程,实验结果表明,该融合模型准确率达94.6%,故障预测提前量较单一模型提升30%以上
牛客网 | 高频面试题 | 设计LRU缓存结构
文章目录题目解析 题目 设计LRU缓存结构_牛客网 示例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)变为最不常用的 第五次操作后:
LinePhone3.2.7(android端最新版本) sip客户端
SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/
IMSL CNL 7.0.0 (x86-64)Crack
IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件
牛客网:设计LRU缓存结构 设计LFU缓存结构
链表 数据结构 牛客网 C++
Outlook Express 6 (OE6) for Win7/Win8/Win10
英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。
设计LRU缓存结构[Java]
文章目录题目描述解题思路代码如下 题目描述 设计LRU(最近最少使用)缓存结构,该结构在构造时确定大小,假设大小为K,并有如下两个功能 set(key, value):将记录(key, value)插入该结构 get(key):返回key对应的value值 提示: 1.某个key的set或get操作一旦发生,认为这个key的记录成了最常使用的,然后都会刷新缓存。 2.当缓存的大小超过K时,移除最不经常使用的记录。 3.输入一个二维数组与K,二维数组每一维有2个或者3个数字,第1个数字为opt,第..
霍尼韦尔SoftMaster使用说明
霍尼韦尔SoftMaster使用说明
【数据结构-链表 八】【链表模拟】模拟设计LRU缓存结构
LRU(Least Recently Used)缓存结构是一种常见的缓存管理策略,用于在有限的缓存空间内存储最近被访问过的数据。该策略的基本思想是,当缓存空间已满并且需要插入新数据时,会优先淘汰掉最近最少被访问的数据,以便为新数据腾出空间。当某个数据被访问时,如果它已经在缓存中,那么它会被标记为最近被访问的数据,因此它会被移到缓存的队列头部(或者链表的头部)。当缓存空间已满并且需要插入新数据时,会淘汰掉队列尾部(或链表末尾)的数据,因为这些数据是最近最少被访问的。
216



被折叠的 条评论
为什么被折叠?



