这种设计数据结构的挺难顶的,leetcode还好,给你具体的需求,方法名参数返回值都有了,如果是直接抽象的给你描述,你需要想方法参数返回值,有几个功能(方法),每个方法细节,最后才是思路。
[以前感觉数据结构课很没用,毕竟每个语言里面基本上基本上都封装的有,只需要去掌握他们就可以了,不需要每一个都实现一下,现在感觉掌握一门语言最好的办法还是先手写一遍常用的数据结构,既可以了解语言语法,又可以了解特性]
class Node:
def __init__(self, key=None, value=None):
self.value = value
self.key = key
self.prev = None
self.next = None
class LRUCache:
def __init__(self, capacity: int):
self.hash_map = {}
self.capacity = capacity
self.first = Node()
self.last = Node()
self.first.next = self.last
self.last.prev = self.first
def get(self, key: int) -> int:
if key in self.hash_map:
self.move_to_end(key)
res = self.hash_map.get(key, -1)
if res == -1:
return res
else:
return res.value
def put(self, key: int, value: int) -> None:
if key in self.hash_map:
self.hash_map[key].value = value
self.move_to_end(key)
else:
if len(self.hash_map) == self.capacity:
self.hash_map.pop(self.first.next.key)
self.first.next = self.first.next.next
self.first.next.prev = self.first
v = Node(key, value)
self.hash_map[key] = v
v.prev = self.last.prev
v.next = self.last
self.last.prev.next = v
self.last.prev = v
def move_to_end(self, key):
v = self.hash_map[key]
v.prev.next = v.next
v.next.prev = v.prev
v.prev = self.last.prev
v.next = self.last
self.last.prev.next = v
self.last.prev = v
网易面试遇到过。