题解 | #设计LRU缓存结构#
设计LRU缓存结构
http://www.nowcoder.com/practice/e3769a5f49894d49b871c09cadd13a61
思路:
1.设计nod类来存储键值对。
2.设计lru类来模拟整个键值对队列。
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) {
ArrayList<Integer> list=new ArrayList<>();
Lru lru=new Lru(k);
for(int[] operator:operators){
//若是set
if(operator[0]==1){
nod n=new nod(operator[1],operator[2]);
lru.set(n);
}else{//若是get
int i = lru.get(operator[1]);
list.add(i);//返回值加入list
}
}
int[] res=new int[list.size()];
//list转数组
for (int i = 0; i < list.size(); i++) {
res[i]=list.get(i);
}
return res;
// write code here
}
}
//lru缓存结构类
class Lru{
private int size;
private int maxSize;
LinkedList<nod> queue=new LinkedList<>();
public Lru(int maxSize) {
this.maxSize = maxSize;
}
public int getSize(){
return queue.size();
}
//题目要求的set方法,即添加方法
public void set(nod n){
//先遍历队列看该键值是否存在
for(nod nod:queue){
//若存在,则直接把队列中的nod的value设置为添加点n的value
if(nod.key==n.key){
nod.value=n.value;
return;
}
}
//若不存在,且当前队列仍有空间,直接添加至队列末尾。
if(getSize()<maxSize){
queue.addLast(n);
}else{//若不存在,则先把队列首的删除,再把nod添加至队列末尾。
queue.removeFirst();
queue.addLast(n);
}
}
//题目要求的查找方法
public int get(int index){
int i=0;//记录nod的位置,便于删除的时候使用。
//遍历队列
for (nod nod : queue) {
//查找到就,把原位置的nod删除,然后添加到队列末尾,即更新操作。
if(nod.key==index){
nod removeNod = queue.remove(i);
queue.addLast(removeNod);
return nod.value;
}
i++;
}
return -1;
}
}
//键值对
class nod{
int key;
int value;
public nod(int key, int value) {
this.key = key;
this.value = value;
}
}