cswork / libraryOpen practice workspace

Interview questions · Sybill

Implement an unbiased array shuffle

This interview question evaluates algorithm design, data structures, correctness, complexity, edge cases, and implementation details in a realistic interview setting. A strong answer for Implement an unbiased array shuffle states assumptions, handles edge cases, explains trade-offs, and shows how to validate the result clearly.

Implement an in-place function shuffle(arr) in JavaScript that returns a uniformly random permutation of the input array. The algorithm must be unbiased (all n! permutations equally likely), run in O(n) time with O(1) extra space, and handle empty or single-element arrays. Explain your approach, justify uniformity at a high level, and analyze time and space complexity.

What a Strong Answer Covers

  • A clear algorithm with the right data structures and enough pseudocode or code-level detail to implement it.
  • A correctness argument that explains why the algorithm covers all required cases.
  • Time and space complexity, plus at least one alternative approach when relevant.
  • Focused tests for normal cases, edge cases, and failure modes.

Follow-up Questions

  • How would the approach change if the input were streaming or too large for memory?
  • What invariants would you assert in production code?
  • Which tests would catch off-by-one, duplicate, or tie-breaking bugs?

Solution

Solution Alignment

The prompt asks for an implementation-level answer. The safest way to present it is to define the state, maintain clear invariants, then walk through complexity and tests.

Problem Restatement

Implement an in-place function shuffle(arr) in JavaScript that returns a uniformly random permutation of the input array. The algorithm must be unbiased (all n! permutations equally likely), run in O(n) time with O(1) extra space, and handle empty or single-element arrays. Explain your approach, justify uniformity at a high level, and analyze time and space complexity.

Recommended Approach

Map the desired probability distribution to numeric intervals. Precompute prefix sums for weighted choices, then draw a uniform random value and binary-search the first prefix that covers it. For uniform geometric sampling, choose the object proportional to its area and then sample coordinates uniformly inside it.

Correctness

The implementation should maintain an invariant after each loop or operation that directly matches the problem statement. At termination, that invariant implies the returned value has considered every valid candidate exactly once, or has preserved the required data-structure state after every API call.

Complexity

Prefix-sum preprocessing is O(n) time and O(n) space; each pick is O(log n). Alias sampling can reduce picks to O(1) when preprocessing is worthwhile.

Edge Cases and Tests

Single item, invalid zero/negative weights, very large totals, deterministic seeds in tests, and empirical distribution checks.

Community answers

Nothing here yet.

Join in on CSWork →