zoukankan      html  css  js  c++  java
  • Datawhale编程实践(LeetCode 腾讯精选练习50)Task12

    1.LRU缓存机制https://leetcode-cn.com/problems/lru-cache/

     拿到题目先想的是用字典,删除元素就想找是否有可以顺序删除字典元素的方法,但是好像没有

    看了官方答案感觉有点高深,哈希表+双向链表

     1 class DLinkedNode:
     2     def __init__(self, key=0, value=0):
     3         self.key = key
     4         self.value = value
     5         self.prev = None
     6         self.next = None
     7 
     8 
     9 class LRUCache:
    10 
    11     def __init__(self, capacity: int):
    12         self.cache = dict()
    13         # 使用伪头部和伪尾部节点    
    14         self.head = DLinkedNode()
    15         self.tail = DLinkedNode()
    16         self.head.next = self.tail
    17         self.tail.prev = self.head
    18         self.capacity = capacity
    19         self.size = 0
    20 
    21     def get(self, key: int) -> int:
    22         if key not in self.cache:
    23             return -1
    24         # 如果 key 存在,先通过哈希表定位,再移到头部
    25         node = self.cache[key]
    26         self.moveToHead(node)
    27         return node.value
    28 
    29     def put(self, key: int, value: int) -> None:
    30         if key not in self.cache:
    31             # 如果 key 不存在,创建一个新的节点
    32             node = DLinkedNode(key, value)
    33             # 添加进哈希表
    34             self.cache[key] = node
    35             # 添加至双向链表的头部
    36             self.addToHead(node)
    37             self.size += 1
    38             if self.size > self.capacity:
    39                 # 如果超出容量,删除双向链表的尾部节点
    40                 removed = self.removeTail()
    41                 # 删除哈希表中对应的项
    42                 self.cache.pop(removed.key)
    43                 self.size -= 1
    44         else:
    45             # 如果 key 存在,先通过哈希表定位,再修改 value,并移到头部
    46             node = self.cache[key]
    47             node.value = value
    48             self.moveToHead(node)
    49     
    50     def addToHead(self, node):
    51         node.prev = self.head
    52         node.next = self.head.next
    53         self.head.next.prev = node
    54         self.head.next = node
    55     
    56     def removeNode(self, node):
    57         node.prev.next = node.next
    58         node.next.prev = node.prev
    59 
    60     def moveToHead(self, node):
    61         self.removeNode(node)
    62         self.addToHead(node)
    63 
    64     def removeTail(self):
    65         node = self.tail.prev
    66         self.removeNode(node)
    67         return node

    2.排序链表https://leetcode-cn.com/problems/sort-list/

    3.最小栈https://leetcode-cn.com/problems/min-stack/

  • 相关阅读:
    c# 对文件操作
    c# 获取当前绝对路径
    c# 过滤特殊字符
    c# txt代码转换成HTML格式
    c# 对象集合转Json
    c# DataReader转换为Json
    c# DataSet转换为Json
    ABAP-SAP的LUW和DB的LUW的区别
    ABAP-关于隐式与显式的DB Commit
    ABAP-Keyword Documentation
  • 原文地址:https://www.cnblogs.com/zmbreathing/p/datawhale_leetcode_task12.html
Copyright © 2011-2022 走看看