设计LRU缓存结构(Python)
设计LRU缓存结构
http://www.nowcoder.com/questionTerminal/e3769a5f49894d49b871c09cadd13a61
前言
话先说在前头,牛客网对 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]