牛客—设计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,表示get(x),若x未出现过或已被移除,则返回-1
对于每个操作2,输出一个答案
思路:
- LinkedHashMap可以作为LRU来使用,但是要重写removeEldestEntry方法。
- LinkedHashMap第三个参数置位true
- arrayList转换成数组类型
Integer[] result=arrayList.toArray(new Integer[arrayList.size()]);
代码:
import java.util.ArrayList;
import java.util.LinkedHashMap;
import java.util.Map;
public class Lru {
LinkedHashMap<Integer,Integer> linkedHashMap;
public int[] LRU (int[][] operators, int k) {
// write code here
linkedHashMap=new LinkedHashMap<Integer, Integer>(k,0.75f,true){
@Override
protected boolean removeEldestEntry(Map.Entry eldest) {
return linkedHashMap.size()>k;
}
};
ArrayList<Integer> arrayList=new ArrayList<>();
for(int i=0;i<operators.length;i++){
if(operators[i][0]==1){
put(operators[i][1],operators[i][2]);
}else if(operators[i][0]==2){
arrayList.add(get(operators[i][1]));
}
}
Integer[] result=arrayList.toArray(new Integer[arrayList.size()]);
int[] res=new int[result.length];
for(int i=0;i<result.length;i++){
res[i]=result[i];
}
return res;
}
public int get(int key){
return linkedHashMap.getOrDefault(key,-1);
}
public void put(int key,int value){
linkedHashMap.put(key, value);
}
}