设计LRU(最近最少使用)缓存结构,该结构在构造时确定大小,假设大小为 k ,并有如下两个功能
-
set(key, value):将记录(key, value)插入该结构
-
get(key):返回key对应的value值
如:输入: [[1,1,1],[1,2,2],[1,3,2],[2,1],[1,4,4],[2,2]],3 输出: [1,-1]
思路:采用链表实现 代码:
class my_node():
def __init__(self,key=None,value= None):
self.key = key
self.value = value
self.pre = None
self.next = None
class my_lru():
def __init__(self,size):
self.size = size
self.hashmap= {}
self.head = my_node()
self.tail = my_node()
self.head.next = self.tail
self.tail.pre = self.head
def move_to_tail(self,key):
node = self.hashmap[key]
node.pre.next = node.next
node.next.pre = node.pre
node.pre = self.tail.pre
node.next = self.tail
self.tail.pre.next = node
self.tail.pre = node
def set_kv(self,key,value):
if key in self.hashmap:
# 如果key本身已经在哈希表中了就不需要在链表中加入新的节点
# 但是需要更新字典该值对应节点的value
self.hashmap[key].value = value
# 之后将该节点移到末尾
self.move_to_tail(key)
else:
if len(self.hashmap) == self.size:
# 去掉哈希表对应项
self.hashmap.pop(self.head.next.key)
# 去掉最久没有被访问过的节点,即头节点之后的节点
self.head.next = self.head.next.next
self.head.next.pre = self.head
# 如果不在的话就插入到尾节点前
new = my_node(key, value)
self.hashmap[key] = new
new.pre = self.tail.pre
new.next = self.tail
self.tail.pre.next = new
self.tail.pre = new
def get_key(self,key):
# print(self.hashmap)
if key in self.hashmap:
# 如果已经在链表中了久把它移到末尾(变成最新访问的)
self.move_to_tail(key)
res = self.hashmap.get(key, -1)
if res == -1:
return res
else:
return res.value
class Solution:
def LRU(self , operators: List[List[int]], k: int) -> List[int]:
lru = my_lru(int(k))
result = []
for i in range(len(operators)):
if int(operators[i][0]) == 1:
lru.set_kv(operators[i][1], operators[i][2])
else:
#print(operators[i][1])
r = lru.get_key(int(operators[i][1]))
result.append(int(r))
return result