NC93 设计LRU缓存结构
感谢牛客题解博主-代码:
import java.util.*;
public class Solution {
/**
* lru design
* @param operators int整型二维数组 the ops
* @param k int整型 the k
* @return int整型一维数组
*思路在于,使用map来判断是否存在key,value;
* 使用链表来判断顺序,使用双向链表在于,需要使用tail来标记要删除的节点
*/
private HashMap<Integer,Node> map = new HashMap<>();
private Node head = new Node(-1,-1);
private Node tail = new Node(-1,-1);
private int k;
public int[] LRU (int[][] operators, int k) {
// write code here
this.k = k;
head.next = tail;
tail.prev = head;
//学会用法
int len = (int)Arrays.stream(operators).filter(x->x[0]==2).count();
int[] res = new int[len];
for(int i =0,j=0;i<operators.length;i++){
if(operators[i][0]==1){
set(operators[i][1],operators[i][2]);
}else{
res[j++] = get(operators[i][1]);
}
}
return res;
}
public void set(int key,int value){
//使用自己定义的get方法时,如果存在,就已经将该节点调整至head了,如果使用map.containsKey(key),还需要操作其调整至head
if(get(key)>-1){
map.get(key).value = value;
}else{
if(map.size()==k){
int rk = tail.prev.key;
tail.prev.prev.next = tail;
tail.prev = tail.prev.prev;
map.remove(rk);
}
Node node = new Node(key,value);
map.put(key,node);
moveToHead(node);
}
}
public int get(int key){
if(map.containsKey(key)){
Node node = map.get(key);
node.prev.next = node.next;
node.next.prev = node.prev;
moveToHead(node);
return node.value;
}
return -1;
}
public void moveToHead(Node node){
node.next = head.next;
head.next.prev = node;
node.prev = head;
head.next = node;
}
static class Node{
int key, value;
Node prev,next;
public Node(int key,int value){
this.key = key;
this.value = value;
}
}
}