题解 | #设计LRU缓存结构#明修栈道,暗度陈仓!
设计LRU缓存结构
http://www.nowcoder.com/practice/e3769a5f49894d49b871c09cadd13a61
打个样
思路很简单,用List维护key的顺序,同时用Map记录键值对。
这样,表现上看是操作Map,实际上是操作List。
插入的时候,判断key是否存在于List:存在,则更新;反之,判断容量是否达到上限,无:则插入;有,则移除、插入。
查询的时候,判断key是否存在于List:存在,则返回对应value;反之,则返回-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
LinkedList<Integer> res = new LinkedList<>();
LinkedList<Integer> list = new LinkedList<>();
HashMap<Integer, Integer> map = new HashMap<>();
for (int i=0;i<operators.length;i++){
if (operators[i][0] == 1){
// insert
int key = operators[i][1];
int value = operators[i][2];
map.put(key,value);
// if key in list
if (list.contains(key)){
list.remove(list.indexOf(key));
list.addFirst(key);
}else{
if (list.size()<k){
list.addFirst(key);
}else{
list.removeLast();
list.addFirst(key);
}
}
}else{
// query
int key = operators[i][1];
int value = -1;
if (list.contains(key)){
value = map.get(key);
list.remove(list.indexOf(key));
list.addFirst(key);
}
res.addLast(value);
}
}
int[] nums = new int[res.size()];
int i = 0;
for (int r:res){
nums[i++] = r;
}
return nums;
}
}
查看9道真题和解析