Engineering practice · 35 MIN
Project · A bounded LRU cache
Keep recency and capacity as explicit invariants.
A least recently used cache evicts the entry that has gone longest without a read or update. Map preserves insertion order, so remove and reinsert a key to mark it recent. Update an existing entry before checking capacity. This local cache models one process; a shared cache additionally needs consistency, expiry and stampede controls. Returning -1 for a miss is this exercise’s contract, not a universal API design.
Treat the function as a small service: define a contract, maintain an invariant, and test the boundaries.
Read the example
const cache = new Map([["a", 1], ["b", 2]]);
cache.delete("a"); cache.set("a", 1);
console.log([...cache.keys()].join(","));Check the expected output
b,a
Your challenge
Input is {capacity: nonnegative integer, operations: arrays of ["put", key, value] or ["get", key]}. Return a list of get results, using -1 for misses. Keys are strings; values are integers. Capacity zero retains nothing.
Solution cost: Expected O(m) for m operations with hash-based Map implementations; ECMAScript guarantees average sublinear access, not strict O(1). time · O(c + r), c cached entries and r returned reads. space
Common trap
Checking if (cache.get(key)) treats a stored zero as a miss. Failing to refresh reads produces FIFO eviction.
Further reading: MDN: Map
Next lesson: Order jobs and detect dependency cycles →