Enter your book access code
The curriculum, drills, tutor, and interviewer mode are for readers of Ace the Rust Interview. The code is printed in the Preface (Companion site access).
Don’t have the book yet? The landing page stays open — purchase unlocks this gym.
183 problems · three tiers
Problem curriculum
Each slug is a self-contained drill: prompt, starter code, Socratic hints, and automated tests. Bookmark slugs (own-move-03), not display numbers — order can shift; slugs do not.
- Beginner (50) — ownership, Option/Result, borrowing, enums. Start at
own-move-01. - Intermediate (103) — traits, concurrency, unsafe redesign, core DSA in idiomatic Rust.
- Advanced (30) — async, WASM, systems design, timed capstones for interviewer mode.
New here? Read how practice works once, then open any row below.
Showing 183 of 183 problems
- 001The moved Stringbeginner
- 002Who owns the return value?beginner
- 003Clone only when you mean itbeginner
- 004Copy and Drop cannot coexistbeginner
- 005Drop order is reverse declarationbeginner
- 006Partial moves from a structbeginner
- 007Pushing through a moved Vecbeginner
- 008into_iter empties the collectionbeginner
- 009Map and and_then without unwrapbeginner
- 010Propagate with ?beginner
- 011Checked add refuses wraparoundbeginner
- 012Defaults without panickingbeginner
- 013map_err into your error typebeginner
- 014Exhaustive Result matchingbeginner
- 015let-else early returnbeginner
- 016transpose Option and Resultbeginner
- 017filter on Optionbeginner
- 018Parse a config line with ?beginner
- 019Prefer &str over String parametersbeginner
- 020Return ownership, not a borrow of a localbeginner
- 021Scalars Copy; Strings movebeginner
- 022Mutable borrow ends before the next usebeginner
- 023A guard's drop is the unlockbeginner
- 024forget is safe — and still a choicebeginner
- 025Redesign to remove the clonebeginner
- 026Push while a reference is livebeginner
- 027Two mutable slices with split_at_mutbeginner
- 028Elision runs out with two inputsbeginner
- 029A struct that borrows a slicebeginner
- 030NLL ends the borrow before you thinkbeginner
- 031Resist Box::leakbeginner
- 032Mutate during immutable iterationbeginner
- 033Outlives bounds in plain Englishbeginner
- 034Reborrows shorten the exclusive regionbeginner
- 035Method elision and selfbeginner
- 036Exhaustiveness over a status enumbeginner
- 037if let vs matchbeginner
- 038Make invalid states unrepresentablebeginner
- 039Match guards and @ bindingsbeginner
- 040A small library error enumbeginner
- 041Application errors with contextbeginner
- 042Panic vs Result policybeginner
- 043Newtype an IDbeginner
- 044Typestate for a connectionbeginner
- 045#[non_exhaustive] for API evolutionbeginner
- 046Cow for maybe-owned stringsbeginner
- 047Return a subslice with the right lifetimebeginner
- 048flatten nested Optionsbeginner
- 049When Rc appears (preview)beginner
- 050Mixed borrow drill (timed)beginner
- 051Rewrite without unsafeintermediate
- 052Encapsulate one unsafe blockintermediate
- 053Replace Rc<RefCell> with indicesintermediate
- 054What Miri would rejectintermediate
- 055Review an unsafe PRintermediate
- 056Write the bound the call site needsintermediate
- 057When dyn Trait is the right callintermediate
- 058impl Trait return vs generic paramintermediate
- 059Newtype around the orphan ruleintermediate
- 060Associated type vs type parameterintermediate
- 061Why Rc cannot cross threadsintermediate
- 062Shared counter with Arc<Mutex>intermediate
- 063Trace the RefCell panicintermediate
- 064Channels move ownershipintermediate
- 065Borrow the stack with thread::scopeintermediate
- 066Stack over Vecintermediate
- 067Queue over VecDequeintermediate
- 068Hit the doubly-linked wallintermediate
- 069Convert pointers to indicesintermediate
- 070Drain without invalidating logicintermediate
- 071Two-sum in a sorted sliceintermediate
- 072Three-sum without aliasing trapsintermediate
- 073Fixed window maximum sumintermediate
- 074Range sums via prefix arrayintermediate
- 075Move zeroes in placeintermediate
- 076Container with most waterintermediate
- 077Rotate with reverseintermediate
- 078Longest subarray under budgetintermediate
- 079Difference array updatesintermediate
- 080The usize underflow trapintermediate
- 081windows vs chunks fluencyintermediate
- 082Merge sorted slices backwardintermediate
- 083Two-sum with a HashMapintermediate
- 084Group anagramsintermediate
- 085Longest substring without repeatintermediate
- 086Subarray sum equals kintermediate
- 087Longest consecutive sequenceintermediate
- 088Minimum window substringintermediate
- 089Byte index is not char indexintermediate
- 090When bytes are enoughintermediate
- 091entry API without double lookupintermediate
- 092Ordered keys with BTreeMapintermediate
- 093Borrowed keys and the Query traitintermediate
- 094Group shifted stringsintermediate
- 095Valid parenthesesintermediate
- 096Next greater elementintermediate
- 097Daily temperaturesintermediate
- 098Sliding-window maximumintermediate
- 099MinStack with ownershipintermediate
- 100Queue from two stacksintermediate
- 101Largest rectangle in histogramintermediate
- 102Evaluate RPNintermediate
- 103Decode stringintermediate
- 104Palindrome with VecDequeintermediate
- 105Asteroid collisionintermediate
- 106Remove adjacent duplicatesintermediate
- 107Invert a binary treeintermediate
- 108Same treeintermediate
- 109Diameter via post-orderintermediate
- 110Level-order traversalintermediate
- 111BST insert and containsintermediate
- 112BST delete with takeintermediate
- 113Validate BST with boundsintermediate
- 114kth smallest via inorderintermediate
- 115Serialize with sentinelintermediate
- 116Lowest common ancestorintermediate
- 117Trie insert and searchintermediate
- 118Trie with '.' wildcardintermediate
- 119k largest with a min-heapintermediate
- 120k-way mergeintermediate
- 121Running medianintermediate
- 122Sort floats with total_cmpintermediate
- 123First true with partition_pointintermediate
- 124Binary search on the answerintermediate
- 125Order statistic without full sortintermediate
- 126Top-k frequentintermediate
- 127Search in rotated arrayintermediate
- 128First and last positionintermediate
- 129Build an adjacency arenaintermediate
- 130BFS shortest pathintermediate
- 131Iterative DFSintermediate
- 132Dijkstra with stale-entry skipintermediate
- 133Kahn topological sortintermediate
- 134Stale handle refusedintermediate
- 135Number of islandsintermediate
- 136Rotting orangesintermediate
- 137Count componentsintermediate
- 138Course scheduleintermediate
- 139Climbing stairsintermediate
- 140Coin changeintermediate
- 141LIS two waysintermediate
- 1420/1 knapsack rolling arrayintermediate
- 143Maximum subarrayintermediate
- 144Subsetsintermediate
- 145Permutationsintermediate
- 146N-Queensintermediate
- 147Memoization vs the borrow checkerintermediate
- 148Union-Find with path compressionintermediate
- 149Merge intervalsintermediate
- 150Meeting rooms / min heapintermediate
- 151Futures do nothing until polledadvanced
- 152Rc held across awaitadvanced
- 153Why poll takes Pinadvanced
- 154Hand-implement YieldOnceadvanced
- 155Twenty-line block_onadvanced
- 156Cancellation at await pointsadvanced
- 157Hand-rolled Join2advanced
- 158std Mutex across awaitadvanced
- 159The stale-waker hangadvanced
- 160Coarse-grained WASM boundaryadvanced
- 161Zero-copy header parseadvanced
- 162Endian-aware byte slice readsadvanced
- 163Integer luma without floatsadvanced
- 164Thread pool with shared Receiveradvanced
- 165Graceful pool shutdownadvanced
- 166LRU within safe boundsadvanced
- 167LRU with index linksadvanced
- 168Single number via XORadvanced
- 169Subsets via bit masksadvanced
- 170Rate limiter ownership mapadvanced
- 171Log ingestion pipelineadvanced
- 172Single-node KV + WAL sketchadvanced
- 173Job scheduler Send boundsadvanced
- 174Ledger transfer kataadvanced
- 175Deterministic maps for consensusadvanced
- 176Relaxed vs Acquire/Releaseadvanced
- 177Lazy init with OnceLockadvanced
- 178async fn in traits Send boundadvanced
- 179Timed mixed screen Aadvanced
- 180Timed mixed screen Badvanced
- 181Lazy adapter chainintermediate
- 182Custom Countdown iteratorintermediate
- 183Collect a fallible iteratorintermediate