写在前面:我是看过力扣的这道题过来的,与牛客这边有两点不同:
- 就是put中,对已存在的key的value更新算不算被使用了,在牛客这里是不算的,而力扣这道题中是算的。需仔细审题来决定put中是否需要在更新已存在key的value的情况下,将该node算为被使用。
- put方法中涉及到capacity的时候,capacity在牛客这里可以为零,而在力扣那道题中只能是正整数。
我的方法也是用哈希表+双向链表头尾空节点的方式
class Node():
def __init__(self, key=0, val=0):
self.key = key
self.val = val
self.prev = None
self.next = None
class LRU():
def __init__(self, capacity):
self.hashmap = dict()
self.head = Node()
self.tail = Node()
self.head.next = self.tail
self.tail.prev = self.head
self.capacity = capacity
def remove_node(self, node):
node.prev.next = node.next
node.next.prev = node.prev
def add_to_end(self, node):
self.tail.prev.next = node
node.prev = self.tail.prev
node.next = self.tail
self.tail.prev = node
def move_to_end(self, node):
self.remove_node(node)
self.add_to_end(node)
def put(self, key, value):
if key in self.hashmap:
node = self.hashmap[key]
node.val = value
if key not in self.hashmap:
node = Node(key, value)
self.hashmap[key] = node
self.add_to_end(self.hashmap[key])
if len(self.hashmap) > self.capacity:
del self.hashmap[self.head.next.key]
self.remove_node(self.head.next)
def get(self, key):
if key not in self.hashmap:
return -1
node = self.hashmap[key]
self.move_to_end(node)
return node.val
def main():
n = int(input())
obj = LRU(capacity=n)
while True:
try:
line = input().split()
if line[0] == 'p':
obj.put(int(line[1]),int(line[2]))
if line[0] == 'g':
ans = obj.get(int(line[1]))
print(ans)
except:
break
main()