Coding questions · Apple
Design card deck with shuffle and order
This question evaluates understanding of data modeling and API design for a deck abstraction, algorithmic handling of randomization and sorting, and the ability to analyze time and space complexity.
Design a playing-card deck library with two methods: shuffle() to return a uniformly random permutation of a standard 52-card deck, and order() to return cards sorted by rank then suit. Use the example ordering Clubs-3, Diamonds-3, Hearts-3, Spades-3, then continue rank 4 through Ace in the same suit order; explicitly define your suit and rank order and the data structures you will use; explain how you ensure an unbiased shuffle and analyze time and space complexity.
Ordered Standard Deck
Return a standard 52-card deck ordered by rank 3 through 2, and suit Clubs, Diamonds, Hearts, Spades within each rank.
Examples
Example 1
Input: ()
Output: ['Clubs-3', 'Diamonds-3', 'Hearts-3', 'Spades-3', 'Clubs-4', 'Diamonds-4', 'Hearts-4', 'Spades-4', 'Clubs-5', 'Diamonds-5', 'Hearts-5', 'Spades-5', 'Clubs-6', 'Diamonds-6', 'Hearts-6', 'Spades-6', 'Clubs-7', 'Diamonds-7', 'Hearts-7', 'Spades-7', 'Clubs-8', 'Diamonds-8', 'Hearts-8', 'Spades-8', 'Clubs-9', 'Diamonds-9', 'Hearts-9', 'Spades-9', 'Clubs-10', 'Diamonds-10', 'Hearts-10', 'Spades-10', 'Clubs-J', 'Diamonds-J', 'Hearts-J', 'Spades-J', 'Clubs-Q', 'Diamonds-Q', 'Hearts-Q', 'Spades-Q', 'Clubs-K', 'Diamonds-K', 'Hearts-K', 'Spades-K', 'Clubs-A', 'Diamonds-A', 'Hearts-A', 'Spades-A', 'Clubs-2', 'Diamonds-2', 'Hearts-2', 'Spades-2']
Explanation: Canonical order.
Hints
- Choose a representation that makes the requested operation direct.
- Handle empty inputs and boundary cases first.
Deterministic Fisher-Yates Shuffle
Given swap indices for Fisher-Yates, return the shuffled deck. swaps[i] is the j selected for i from n-1 down to 1.
Examples
Example 1
Input: ([0,1,2],)
Output: ['Spades-2', 'Hearts-2', 'Diamonds-2', 'Spades-3', 'Clubs-4', 'Diamonds-4', 'Hearts-4', 'Spades-4', 'Clubs-5', 'Diamonds-5', 'Hearts-5', 'Spades-5', 'Clubs-6', 'Diamonds-6', 'Hearts-6', 'Spades-6', 'Clubs-7', 'Diamonds-7', 'Hearts-7', 'Spades-7', 'Clubs-8', 'Diamonds-8', 'Hearts-8', 'Spades-8', 'Clubs-9', 'Diamonds-9', 'Hearts-9', 'Spades-9', 'Clubs-10', 'Diamonds-10', 'Hearts-10', 'Spades-10', 'Clubs-J', 'Diamonds-J', 'Hearts-J', 'Spades-J', 'Clubs-Q', 'Diamonds-Q', 'Hearts-Q', 'Spades-Q', 'Clubs-K', 'Diamonds-K', 'Hearts-K', 'Spades-K', 'Clubs-A', 'Diamonds-A', 'Hearts-A', 'Spades-A', 'Clubs-2', 'Hearts-3', 'Diamonds-3', 'Clubs-3']
Explanation: First three deterministic swaps from the end.
Example 2
Input: ([],)
Output: ['Clubs-3', 'Diamonds-3', 'Hearts-3', 'Spades-3', 'Clubs-4', 'Diamonds-4', 'Hearts-4', 'Spades-4', 'Clubs-5', 'Diamonds-5', 'Hearts-5', 'Spades-5', 'Clubs-6', 'Diamonds-6', 'Hearts-6', 'Spades-6', 'Clubs-7', 'Diamonds-7', 'Hearts-7', 'Spades-7', 'Clubs-8', 'Diamonds-8', 'Hearts-8', 'Spades-8', 'Clubs-9', 'Diamonds-9', 'Hearts-9', 'Spades-9', 'Clubs-10', 'Diamonds-10', 'Hearts-10', 'Spades-10', 'Clubs-J', 'Diamonds-J', 'Hearts-J', 'Spades-J', 'Clubs-Q', 'Diamonds-Q', 'Hearts-Q', 'Spades-Q', 'Clubs-K', 'Diamonds-K', 'Hearts-K', 'Spades-K', 'Clubs-A', 'Diamonds-A', 'Hearts-A', 'Spades-A', 'Clubs-2', 'Diamonds-2', 'Hearts-2', 'Spades-2']
Explanation: No swaps returns ordered deck.
Hints
- Choose a representation that makes the requested operation direct.
- Handle empty inputs and boundary cases first.