Python 哈希表+双向链表/有序字典

设计LRU缓存结构

http://www.nowcoder.com/questionTerminal/e3769a5f49894d49b871c09cadd13a61

最近使用的放在链表尾部

哈希表 + 双向链表

class DListNode:
    def __init__(self, x=0, y=0):
        self.key = x
        self.value = y
        self.pre = None
        self.next = None

class Solution:
    def __init__(self):
        self.head = DListNode()
        self.tail = DListNode()
        self.head.next = self.tail
        self.tail.pre = self.head
        self.cache = dict()

    def get(self, key):
        if key not in self.cache:
            return -1
        node = self.cache[key]
        self.move_to_end(node)
        return node.value

    def set(self, key, value, k):
        if key in self.cache:
            node = self.cache[key]
            node.value = value
            self.move_to_end(node)
        else:
            node = DListNode(key, value)
            self.cache[key] = node
            self.add_to_end(node)
            if len(self.cache) > k:
                removed = self.head.next
                self.remove(removed)
                del self.cache[removed.key]

    def remove(self, node):
        node.pre.next = node.next
        node.next.pre = node.pre

    def add_to_end(self, node):
        node.pre = self.tail.pre
        node.next = self.tail
        self.tail.pre.next = node
        self.tail.pre = node

    def move_to_end(self, node):
        self.remove(node)
        self.add_to_end(node)

    def LRU(self, operators, k):
        res = []
        for opt in operators:
            if opt[0] == 1:
                self.set(opt[1], opt[2], k)
            elif opt[0] == 2:
                res.append(self.get(opt[1]))
        return res

有序字典

from collections import OrderedDict
class Solution:
    def __init__(self):
        self.cache = OrderedDict()

    def get(self, key):
        if key not in self.cache:
            return -1
        self.cache.move_to_end(key)
        return self.cache[key]

    def set(self, key, value, k):
        if key in self.cache:
            self.cache.move_to_end(key)
        self.cache[key] = value
        if len(self.cache) > k:
            self.cache.popitem(last=False)

    def LRU(self, operators, k):
        res = []
        for opt in operators:
            if opt[0] == 1:
                self.set(opt[1], opt[2], k)
            elif opt[0] == 2:
                res.append(self.get(opt[1]))
        return res
全部评论
我也用OrderedDict,超时了诶
点赞 回复 分享
发布于 2021-03-30 11:02

相关推荐

11-28 17:58
门头沟学院 Java
美团 JAVA开发 n×15.5
牛客786276759号:百度现在晋升很难的 而且云这块的业务没美团好 你看百度股价都跌成啥样了
点赞 评论 收藏
分享
10-17 12:16
同济大学 Java
7182oat:快快放弃了然后发给我,然后让我也泡他七天最后再拒掉,狠狠羞辱他一把😋
点赞 评论 收藏
分享
已老实求offer😫:有点像徐坤(没有冒犯的意思哈)
点赞 评论 收藏
分享
评论
7
2
分享
牛客网
牛客企业服务