Bird
Raised Fist0
Interview Prepstacks-monotonic-stackmediumAmazonGoogleMicrosoft

Design Circular Queue

Choose your preparation mode4 modes available
▶
Steps
setup

Initialize Circular Queue

We create a circular queue of capacity 3. The internal array is initialized with zeros, and head, tail, and size pointers are set to 0.

💡 Initialization sets the stage for all operations by defining the fixed size and starting pointers.
Line:self.queue = [0] * k self.head = 0 self.tail = 0 self.size = 0 self.capacity = k
💡 The queue is empty initially, with head and tail at the same position and size zero.
📊
Design Circular Queue - Watch the Algorithm Execute, Step by Step
Watching each pointer move and each element insertion or removal helps you understand how the circular queue efficiently uses a fixed-size array without shifting elements.
Step 1/15
·Active fill★Answer cell
no_op
Stack (top→bottom)
0
0
0
no_op
Stack (top→bottom)
0
0
0
pushElement[0]: 1
Stack (top→bottom)
0
0
1
↑ pushed: 1
Contributes: true
no_op
Stack (top→bottom)
0
0
1
pushElement[1]: 2
Stack (top→bottom)
0
2
1
↑ pushed: 2
Contributes: true
no_op
Stack (top→bottom)
0
2
1
pushElement[2]: 3
Stack (top→bottom)
3
2
1
↑ pushed: 3
Contributes: true
no_op
Stack (top→bottom)
3
2
1
Contributes: false
peekElement[2]: 3
Stack (top→bottom)
3
2
1
Contributes: 3
no_op
Stack (top→bottom)
3
2
1
Contributes: true
no_op
Stack (top→bottom)
3
2
1
popElement[0]: 1
Stack (top→bottom)
3
2
1
↓ popped: [1]
Contributes: true
no_op
Stack (top→bottom)
3
2
1
pushElement[0]: 4
Stack (top→bottom)
3
2
4
↑ pushed: 4
Contributes: true
peekElement[0]: 4
Stack (top→bottom)
3
2
4
Contributes: 4

Key Takeaways

✓ The circular queue uses modular arithmetic to wrap the tail and head pointers, efficiently reusing array space without shifting elements.

This wrap-around behavior is hard to visualize from code alone but becomes clear when watching pointers move step-by-step.

✓ The size variable is crucial to distinguish between full and empty states, since head == tail can mean either.

Understanding this subtlety is easier when you see the size increment and decrement alongside pointer movements.

✓ Enqueue and dequeue operations each advance one pointer and update size by exactly one, maintaining FIFO order without data movement.

Seeing each pointer move individually clarifies how the queue maintains order and capacity constraints.

Practice

(1/5)
1. Given the following code for largestRectangleArea, what is the returned max_area for input heights = [2,1,2]?
easy
A. 3
B. 4
C. 2
D. 1

Solution

  1. Step 1: Trace stack operations for heights=[2,1,2]

    i=0,h=2: stack=[0]; i=1,h=1: pop 0 (height=2,width=1), max_area=2; stack=[]; append 1; i=2,h=2: append 2; i=3,h=0: pop 2 (height=2,width=1), max_area=2; pop 1 (height=1,width=3), max_area=3
  2. Step 2: Final max_area after processing all elements

    max_area=3
  3. Final Answer:

    Option A -> Option A
  4. Quick Check:

    Max rectangle area is 3 for input [2,1,2] [OK]
Hint: Remember to add sentinel zero to flush stack [OK]
Common Mistakes:
  • Forgetting sentinel zero causes missed areas
  • Incorrect width calculation
  • Off-by-one in stack indices
2. Given an integer array, you need to find the sum of the minimum values of all possible contiguous subarrays. Which algorithmic approach guarantees an optimal O(n) time complexity solution?
easy
A. Monotonic stack to find previous less and next less elements for each array element
B. Greedy approach selecting minimum elements from left to right
C. Dynamic programming with memoization of subarray minimums
D. Brute force nested loops checking all subarrays and their minimums

Solution

  1. Step 1: Understand problem constraints

    The problem requires summing minimums of all subarrays efficiently, which brute force cannot do in O(n).
  2. Step 2: Identify the pattern

    Monotonic stack helps find previous less and next less elements in O(n), enabling counting subarrays where each element is minimum.
  3. Final Answer:

    Option A -> Option A
  4. Quick Check:

    Monotonic stack approach is known optimal for this problem [OK]
Hint: Monotonic stack finds boundaries for minimums in O(n) [OK]
Common Mistakes:
  • Assuming greedy or DP solves this in O(n)
  • Confusing with maximum subarray problems
3. Consider this buggy version of the decodeString function. Which line contains the subtle bug that causes incorrect decoding for inputs with multiple bracketed substrings?
medium
A. Line appending current_string to string_stack
B. Line popping count from count_stack
C. Line resetting k after '[' is missing
D. Line appending characters to current_string

Solution

  1. Step 1: Identify where repeat count is reset

    After pushing k to count_stack on '[', k must be reset to 0 to avoid carryover to next substring.
  2. Step 2: Locate missing reset

    The code comment indicates missing reset of k after pushing it, causing subsequent repeats to accumulate incorrectly.
  3. Final Answer:

    Option C -> Option C
  4. Quick Check:

    Resetting k prevents repeat count carryover bugs [OK]
Hint: Repeat count must reset after pushing to stack [OK]
Common Mistakes:
  • Forgetting to reset repeat count after '['
  • Mismanaging stack push/pop order
4. Suppose the calculator expression can contain multiplication '*' and division '/' operators in addition to plus, minus, and parentheses. Which modification to the stack-based approach correctly handles operator precedence and parentheses?
hard
A. Use two stacks: one for numbers and one for operators, applying operators with higher precedence immediately before pushing lower precedence operators
B. Continue using a single stack and apply all operators in the order they appear, ignoring precedence
C. Convert the expression to postfix notation first, then evaluate using a stack
D. Evaluate recursively without any stack, relying on Python's eval() function

Solution

  1. Step 1: Understand operator precedence

    Multiplication and division have higher precedence than addition and subtraction, so evaluation order matters.
  2. Step 2: Modify stack approach

    Using two stacks (numbers and operators) allows applying higher precedence operators immediately, preserving correct order.
  3. Step 3: Why other options fail

    Single stack ignoring precedence leads to wrong results; postfix conversion is valid but more complex; relying on eval() is unsafe and not interview-appropriate.
  4. Final Answer:

    Option A -> Option A
  5. Quick Check:

    Two-stack approach is standard for precedence and parentheses [OK]
Hint: Two stacks handle precedence and parentheses correctly [OK]
Common Mistakes:
  • Ignoring precedence or relying on single stack only
5. Suppose the stock prices can be negative and you want to compute the span as before. Which modification to the monotonic stack approach correctly handles negative prices without breaking the algorithm?
hard
A. Store pairs of (price, span) in the stack and accumulate spans when popping
B. Change the while condition to pop only when top price is strictly less than current price
C. Use a balanced binary search tree instead of a stack to handle negative values
D. No change needed; the existing monotonic stack approach works for negative prices

Solution

  1. Step 1: Understand impact of negative prices

    Negative prices do not affect the monotonic stack logic, but to handle spans correctly, storing spans with prices helps accumulate consecutive spans efficiently.
  2. Step 2: Why storing (price, span) pairs works

    When popping smaller or equal prices, their spans can be added to the current span, allowing correct span calculation even with negative or mixed values.
  3. Step 3: Why other options fail

    Changing while condition to strict less breaks equal price handling. Balanced BST is unnecessary overhead. No change ignores span accumulation needed for correctness.
  4. Final Answer:

    Option A -> Option A
  5. Quick Check:

    Storing spans with prices is a known robust solution [OK]
Hint: Store (price, span) pairs to accumulate spans correctly [OK]
Common Mistakes:
  • Assuming no change needed
  • Using strict less instead of less or equal
Recommended

Ready to prove it?

Pass the test and this pattern moves unknown strong while earning +1 Grip toward your certificate.

10 questions~5 mineasy hard