題目描述
設計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,輸出一個答案
若opt=2,接下來一個整數x,表示get(x),若x未出現過或已被移除,則返回-1
對於每個操作2,輸出一個答案
輸入:[[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)變為最不常用的
第五次操作后:大小超過了3,所以移除此時最不常使用的記錄("2", 2),加入記錄("4", 4),並且為最常使用的記錄,然后("3", 2)變為最不常使用的記錄
解析:
二維數組中第0位即:[1,1,1],第一個1表示opt=1,要set(1,1),即要將(1,1)插入緩存
二維數組中第1為即:[1,2,2],第一個1表示opt=1,要set(2,2),即要將(2,2)插入緩存
二維數組中第2位即:[1,3,2],第一個1表示opt=1,要set(3,2),即要將(3,2)插入緩存
二維數組中第3位即:[2,1],第一個2表示opt=2,要get(1),即從緩存中查找key為1的值,前面已經插入了key=1,所以返回1,這個要保存到返回數組中
二維數組中第5位即:[2,2],第一個2表示opt=2,要get(2),即從緩存中查找key為2的值,由於緩存大小為3,所以前面插入的key=2已經被擠出緩存,所以返回結果為-1,這個要保存到返回數組中
所以輸出為[1,-1]
import java.util.*; public class Solution { /** * lru design * @param operators int整型二維數組 the ops * @param k int整型 the k * @return int整型一維數組 */ public int[] LRU (int[][] operators, int k) { // write code here Map<Integer,Integer> map = new LinkedHashMap<>(); List<Integer> list = new LinkedList<>(); for (int[] operator : operators){ // System.out.println(Arrays.toString(operator)); int key = operator[1]; switch(operator[0]){ // opt=1 case 1: int value = operator[2]; if (map.size() < k){ map.put(key,value); }else { // 當緩存的大小超過K時,移除最不經常使用的記錄,即set或get最久遠的 Iterator it = map.keySet().iterator(); map.remove(it.next()); map.put(key,value); } break; // opt=2 case 2: if (map.containsKey(key)){ int val = map.get(key); list.add(val); map.remove(key); map.put(key,val); }else{ list.add(-1); } break; default: } } int[] res = new int[list.size()]; int i = 0; for (int val : list){ res[i++] = val; } return res; } }