题解 | #设计LRU缓存结构#
设计LRU缓存结构
http://www.nowcoder.com/practice/e3769a5f49894d49b871c09cadd13a61
import java.util.*;
class LruCache{
class DListNode{
int key;
int value;
DListNode prev;
DListNode next;
public DListNode(){}
public DListNode(int _key,int _value){key = _key;value = _value;}
}
Map<Integer,DListNode> cache;
int capacity = 0,size = 0;
static DListNode head,tail;
public LruCache(int capacity){
this.capacity = capacity;
cache = new HashMap<>();
size = 0;
head = new DListNode();
tail = new DListNode();
head.next = tail;
tail.prev = head;
}
public void set(int key,int value){
DListNode node = cache.get(key);
if(node == null){
DListNode add = new DListNode(key,value);
insertToHead(add);
++size;
cache.put(key,add);
if(size > capacity){
DListNode rnode = removeTail();
cache.remove(rnode.key);
--size;
}
}
else{
node.value = value;
moveToHead(node);
}
}
public int get(int key){
DListNode node = cache.get(key);
if(node == null){
return -1;
}
else {
moveToHead(node);
return node.value;
}
}
public void remove(DListNode node){
node.prev.next = node.next;
node.next.prev = node.prev;
}
public void insertToHead(DListNode add){
add.prev = head;
head.next.prev = add;
add.next = head.next;
head.next = add;
}
public void moveToHead(DListNode node){
remove(node);
insertToHead(node);
}
public DListNode removeTail(){
DListNode node = tail.prev;
remove(node);
return node;
}
}
public class Solution {
public int[] LRU (int[][] operators, int k) {
int M = operators.length;
List<Integer> res = new ArrayList<>();
LruCache lru = new LruCache(k);
for(int i = 0;i<M;i++){
if(operators[i][0] == 1){
int key = operators[i][1];
int value = operators[i][2];
lru.set(key,value);
}
else{
int key = operators[i][1];
res.add(lru.get(key));
}
}
int n = res.size();
int[] fin = new int[n];
for(int i = 0;i<n;i++){
fin[i] = res.get(i);
}
return fin;
}
}
查看29道真题和解析
