"LRUCache","put", "put", "get", "put", "get", "put", "get", "get", "get"
[2], [1, 1], [2, 2], [1], [3, 3], [2], [4, 4], [1], [3], [4]
是啥意思:
- 第一个数组:方法名列表,意思是调用这个方法
- 第二个数组:对应每个方法的参数列表
本题需要用到一个哈希表和一个双向链表
这是由于题目要求:
get 和 put 操作 平均时间复杂度 O (1) get (key):存在就返回 value,并且 标记这个 key 最近被使用;
不存在返回 - 1 put (key,value):存在就更新值 + 标记最近使用;不存在就插入。如果超过容量, 删除最久未使用的那个元素
LRUCache的构造方法:
java
public LRUCache(int capacity) {
super(capacity, 0.75F, true);
this.capacity = capacity;
}
super()方法,即调用LinkedHashMap 的构造方法:
先知道LinkedHashMap,就是HashMap的链表变成了双向链表(主要但不是唯一区别)
三个参数:
capacity:容量,也就是数组长度
0.75F:负载因子,和hashmap一样达到0.75就扩容
true:
get方法
java
public int get(int key) {
return super.getOrDefault(key, -1);
}
存在key返回对应指,否则返回默认值 -1
put方法
java
public void put(int key, int value) {
super.put(key, value);
}
钩子回调函数
java
@Override
protected boolean removeEldestEntry(Map.Entry<Integer, Integer> eldest) {
return size() > capacity;
}

即先判断是否size() > capacity,若是,则删
看完整代码:
java
class LRUCache extends LinkedHashMap<Integer, Integer>{
private int capacity;
public LRUCache(int capacity) {
super(capacity, 0.75F, true);
this.capacity = capacity;
}
public int get(int key) {
return super.getOrDefault(key, -1);
}
public void put(int key, int value) {
super.put(key, value);
}
@Override
protected boolean removeEldestEntry(Map.Entry<Integer, Integer> eldest) {
return size() > capacity;
}
}
此做法做法都不会符合面试官的要求
在面试中,面试官一般会期望读者能够自己实现一个简单的双向链表,而不是使用语言自带的、封装好的数据结构
下期手搓!
