重庆交通大学官网网站,公司网站 建设,wordpress在线预览,免费网站推广咱们做一、题目
设计LRU(最近最少使用)缓存结构#xff0c;该结构在构造时确定大小#xff0c;假设大小为 capacity #xff0c;操作次数是 n #xff0c;并有如下功能:
Solution(int capacity) 以正整数作为容量 capacity 初始化 LRU 缓存get(key)#xff1a;如果关键字 key …一、题目
设计LRU(最近最少使用)缓存结构该结构在构造时确定大小假设大小为 capacity 操作次数是 n 并有如下功能:
Solution(int capacity) 以正整数作为容量 capacity 初始化 LRU 缓存get(key)如果关键字 key 存在于缓存中则返回key对应的value值否则返回 -1 。set(key, value)将记录(key, value)插入该结构如果关键字 key 已经存在则变更其数据值 value如果不存在则向缓存中插入该组 key-value 如果key-value的数量超过capacity弹出最久未使用的key-value 提示: 1.某个key的set或get操作一旦发生则认为这个key的记录成了最常使用的然后都会刷新缓存。 2.当缓存的大小超过capacity时移除最不经常使用的记录。 3.返回的value都以字符串形式表达如果是set则会输出null来表示(不需要用户返回系统会自动输出)方便观察 4.函数set和get必须以O(1)的方式运行 5.为了方便区分缓存里key与value下面说明的缓存里key用号包裹 数据范围:略 示例 [“set”,“set”,“get”,“set”,“get”,“set”,“get”,“get”,“get”],[[1,1],[2,2],[1],[3,3],[2],[4,4],[1],[3],[4]],2 [“null”,“null”,“1”,“null”,“-1”,“null”,“-1”,“3”,“4”] 二、思路
看上去很复杂实际上只要考虑好结构就行了。可以看到set和get都需要O(1)的复杂度所以需要一个哈希结果。其次有一个自动移除最近不活跃节点的机制那么就得考虑结果有序链表或栈之类。合在一起就有一个很合适的数据结构了。LinkedHashMap。
三、代码
public class Solution {MapInteger,Integer map;private int capacity;public Solution(int capacity) {// write code heremap new LinkedHashMap(capacity);this.capacity capacity;}public int get(int key) {// write code hereInteger resultValue map.get(key);if(resultValue null){return -1;}else {//将该key存入最后map.remove(key);map.put(key,resultValue);return resultValue;}}public void set(int key, int value) {// write code here//是否存在keyif(map.containsKey(key)){map.remove(key);map.put(key,value);}else{map.put(key, value);}//然后判断是否溢出if(capacity map.size()){Integer firstKey map.keySet().iterator().next();map.remove(firstKey);}}}