diff grok_interview/LRU.py @ 51:68fa88ac73fe

Interview prep for xAI
author June Park <parkjune1995@gmail.com>
date Mon, 15 Dec 2025 19:55:17 -0800
parents
children
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/grok_interview/LRU.py	Mon Dec 15 19:55:17 2025 -0800
@@ -0,0 +1,46 @@
+from typing import Optional
+
+
+class Node:
+    def __init__(self, key, value):
+        self.key = key
+        self.value = value
+        self.next: Optional[Node] = None
+        self.prev: Optional[Node] = None
+
+class LRUCache:
+
+    def __init__(self, capacity: int):
+        self.capacity = capacity
+        self.map = {}
+        self.head = Node(-1, -1)
+        self.tail = Node(-1, -1)
+        self.head.next, self.tail.prev = self.tail, self.head
+
+    def get(self, key: int) -> int:
+        if not key in self.map:
+            return -1
+        node = self.map[key]
+        self._deleteAndAdd(node)
+        return node.value
+        
+    def put(self, key: int, value: int) -> None:
+        newNode = Node(key, value)
+        if key in self.map:
+            self._delete(self.map[key])
+        else:
+            if len(self.map.keys())+1 > self.capacity:
+                del self.map[self.head.next.key]
+                self._delete(self.head.next)
+        self._add(newNode)
+        self.map[key] = newNode
+
+    def _deleteAndAdd(self, node):
+        self._delete(node)
+        self._add(node)
+
+    def _delete(self, node):
+        node.prev.next, node.next.prev = node.next, node.prev
+
+    def _add(self, node):
+        node.prev, node.next, self.tail.prev.next, self.tail.prev = self.tail.prev, self.tail, node, node