前言

话先说在前头,牛客网对 Python 的支持太差了,这个代码是 超时 的。


排行榜和讨论区上都是拆输入的字符,虽然为了 AC 是无可厚非,但我觉得至少应该有个正经解以供后人参考(虽然这个过不了)。

代码

重点是 collections.OrderedDict(),可以点击 Python官方文档 学习
另外理解方面最重要的一点是,有序字典 末尾是最新 的键值对。

#
# lru design
# @param operators int整型二维数组 the ops
# @param k int整型 the k
# @return int整型一维数组
#
import collections

class Solution:

    def LRU(self , operators , k ):
        self.k, self.lru = k, collections.OrderedDict()
        res = []
        for x in operators:
            if x[0] == 1:
                self._set(x[1], x[2])
            elif x[0] == 2:
                res.append(self.get(x[1]))
        return res


    def _set(self, key, value):
        key = str(key)
        if key in self.lru:  # 已有的键值对就移到最后
            self.lru.move_to_end(key)
        else:
            if len(self.lru) >= self.k:  # 大于等于容量就要删最老的
                self.lru.popitem(last=False)  # 方法中参量 last,False 代表 FIFO
            self.lru[key] = value


    def get(self, key):
        key = str(key)
        if key not in self.lru:
            return -1
        else:
            self.lru.move_to_end(key)
            return self.lru[key]