一千次放弃,一千零一次坚持

找实习迫在眉睫,好慌,也不知道准备啥,就先把hot100的题做一做吧。做过好多遍了,熟悉一下

146,我是个起名字天才,O(∩_∩)O哈哈~

TODO 哪个题用了俩map或者hash?有读者知道的话希望评论下

class DLinkedNode:
    def __init__(self, key=float('inf'), value=float('inf')):
        self.key = key
        self.value = value
        self.next = None
        self.pre = None
class LRUCache:
    # TODO 哪个题用了俩map或者hash?
    def __init__(self, capacity: int):
        self.cache = dict() # 除了这一个其他都是成对儿的
        self.headSalve = DLinkedNode() # 哨兵节点,一个就够了,俩还起名字这么混淆
        self.tailSlave = DLinkedNode()
        self.headSalve.next = self.tailSlave
        self.tailSlave.pre = self.headSalve
        self.capacity = capacity
        self.size = 0
    # 如果cache里不存在,返回-1,如果存在先移动到前面,然后返回VALUE
    def get(self, key: int) -> int:
        if key not in self.cache:
            return -1
        node = self.cache[key]
        self.moveToHead(node)
        return node.value

    def put(self, key: int, value: int) -> None:
        if key not in self.cache:
            node = DLinkedNode(key, value)
            self.cache[key] = node
            self.addToHead(node)
            self.size += 1
            if self.size > self.capacity:
                removed = self.removeTail()
                self.cache.pop(removed.key)
                self.size -= 1
        else:
            node = self.cache[key]
            node.value = value # 更新一下
            self.moveToHead(node)

    # 这个有点复杂
    def addToHead(self, node):
        node.prev = self.headSalve
        node.next = self.headSalve.next
        self.headSalve.next.prev = node
        self.headSalve.next = node

    def removeNode(self, node):
        node.prev.next = node.next
        node.next.prev = node.prev

    def moveToHead(self, node):
        self.removeNode(node)
        self.addToHead(node)

    def removeTail(self):
        node = self.tailSlave.prev
        self.removeNode(node)
        return node

你可能感兴趣的:(python,面试)