Skip to content
Open
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
50 changes: 50 additions & 0 deletions Sprint-2/implement_lru_cache/lru_cache.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,50 @@
import sys
import os
sys.path.append(os.path.abspath(os.path.join(os.path.dirname(__file__), "../implement_linked_list")))
Comment on lines +2 to +3

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think you can include linked_lst.py from the other exercise in this folder, as this script requires it to work. If a reviewer haven't yet seen your LinkedList implementation, they may ask for it.

@jamallaqdiem jamallaqdiem Jul 15, 2026

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Hi @cjyuan thanks for the review, I tried that way in my PR Closed however the metadata for the PR check didn't allow it, so I had to close and open a new one.
which better way I should use?

@cjyuan cjyuan Jul 15, 2026

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The validation bot is very rigid -- it expects changes to be made only in some folder for each exercise.
So to by pass the check, you would have to copy the file linked_list.py into the implement_lru_cache folder. It's not a normal way to reuse code; just a way to by pass the bot check.

Don't worry about it.


from linked_list import LinkedList, Node # type:ignore
from typing import Any

class LruCache:
def __init__(self, limit: int):
if limit <= 0:
raise ValueError("Limit must be greater than 0")
self.capacity = limit
# maps key
self.cache: dict[Any, Node] = {}
# tracking the usage order head first tail last.
self.list = LinkedList()

def get(self, key: Any) -> Any:
# If key not exist return None
if key not in self.cache:
return None

node_handle = self.cache[key]

# we get the value to return
_, value = node_handle.value

# we use remove() and push_head() to remove it from the position to the head
self.list.remove(node_handle)
self.cache[key] = self.list.push_head((key, value))

return value

def set(self, key: Any, value: Any) -> None:
if key in self.cache:
self.list.remove(self.cache[key])
# we do this because the position and value about to change.
del self.cache[key]

# we call pop_tail() to cut off the tail
elif len(self.cache) >= self.capacity:
# return the value stored in the tail node
oldest_item = self.list.pop_tail()
if oldest_item:
oldest_key, _ = oldest_item
del self.cache[oldest_key]

## place the new items at the head of stack and update and return the object Node.
new_node = self.list.push_head((key, value))
self.cache[key] = new_node
Loading