We use cookies for site analytics. Accept to help us understand how the site is used. See our Privacy Policy for details.
A hard design problem, graded against 6 test cases (3 of them hidden).
Build a working data structure to an API - LRU caches, rate limiters, and iterators.
Reach for it when you see: "Design a class supporting these operations in O(1)" - an API rather than a single function.
More Designproblems →Don't run a background timer adding tokens - instead, compute the refill *on demand* when a request arrives. State per bucket: `tokens` (float) and `lastRefill` (timestamp).
```
allow(t):
elapsed = t - lastRefill
tokens = min(capacity, tokens + elapsed * refillRate)
lastRefill = t
if tokens >= 1:
tokens -= 1
return True
return False
```
Why this is the standard answer over leaky-bucket / sliding-window:
- Token bucket allows bursts up to `capacity` (good for legit users that occasionally spike).
- Sliding-window-counter is more accurate but uses more memory per key.
- Leaky-bucket smooths but doesn't allow bursts.
Distributed extension (interview follow-up): put state in Redis with atomic Lua script (`GET tokens, lastRefill → compute → SET`) or use a shared distributed token store like Stripe's [twitter-style rate limiter](https://stripe.com/blog/rate-limiters). The single-machine algorithm above is the basis.
The full reference solution in every supported language stays in the editor above - reveal it there once you have had a real attempt.
Read off this problem's own test suite, so these are the cases a submission actually has to survive.
These apply to the pattern as a whole, not just this problem.