Interview patterns, made visible
The interview patterns of data structures and algorithms, each one drawn, traced line by line in Python, and explained from brute force up. Free to read.
Patterns and reading
- Two pointers
- Sliding window
- Prefix sums and hashing
- Monotonic stack and deque
- Binary search, on index and on answer
- Intervals and sweep line
- Linked list in place
- Heaps: top-K, two heaps, k-way merge
- Tree DFS
- BFS
- Graph DFS and components
- Topological sort
- Union-find
- Shortest paths
- Trie
- Backtracking
- DP I: linear and knapsack
- DP II: grids, strings, intervals
- Greedy
- Composite structures
- Complexity and amortized analysis
- Concurrency in Python, for a round
- The practical coding round
- Python for production-style code
- What Python’s containers cost
- Clocks and time in Python
- The pull request you would not approve
- The threading and queue APIs
- Recursion and the call stack
- How a hash table works
- concurrent.futures: executors and futures
- The map: from a prompt to a pattern
- The asyncio API
- How CPython runs your code
- Look-alikes: the right pattern for the wrong prompt
- Testing concurrent code
- Locks, semaphores, conditions
- Races, deadlock, starvation, livelock
- Producer-consumer, pipelines, worker pools
- Build a rate limiter
- The concurrency round
- The method
- Build a key-value store
- Memory, for a round
- Build a bank ledger
- Processes, syscalls, signals
- Build a spreadsheet
- Files, sockets, and partial results
- Build a game engine
- Compare-and-swap and memory ordering
- Build a log flusher
- The Python kit
- Build a concurrent key-value store
- Python API reference
- Build a worker pool
- Build a bounded blocking queue
- Build a concurrent cache
- Build a delayed task scheduler
- Templates
- Build a concurrent web crawler
- Build a durable event writer
- Build a thread-safe rate limiter
- Build a memory allocator
- Answering at levels
- Build a ring buffer
- Build a framed message server
- Build a log-structured store
- Problem index