或许有点简单,有点麻烦。但确实是通关了!
/**
* 用两个LinkedList分别表示key和value。
* 往first的位置插入元素
* 一旦发生的set和get操作就插入,删除原来有的
*
* @param operators
* @param k
* @return
*/
public static int[] LRU(int[][] operators, int k) {
//用来存放所有的key
LinkedList<Integer> key = new LinkedList<>();
//用来存放所有的value
LinkedList<Integer> value = new LinkedList<>();
//用来存放被返回的元素
List<Integer> result = new ArrayList<>();
for (int[] operator : operators) {
//进行set操作
if (operator[0] == 1) {
//删除原来有的
if (key.contains(operator[1])) {
int i = key.indexOf(operator[1]);
value.remove(i);
key.remove(i);
}
key.addFirst(operator[1]);
value.addFirst(operator[2]);
//缓存里面多于k个元素,删除多的
if (key.size() > k) {
key.removeLast();
value.removeLast();
}
}
//进行get操作
else {
//如果不包含就返回-1
if (!key.contains(operator[1])) {
result.add(-1);
}
//如果包含就把值存入result中,并更新缓存
else {
Integer integer1 = value.get(key.indexOf(operator[1]));
result.add(integer1);
//更新缓存
key.remove(value.indexOf(integer1));
value.remove(integer1);
key.addFirst(operator[1]);
value.addFirst(integer1);
}
}
}
//按需求 设置一个用于返回值的数组
int[] a = new int[result.size()];
for (int i = 0; i < result.size(); i++) {
a[i] = result.get(i);
}
return a;
}