Bird
Raised Fist0
DSA Rustprogramming~20 mins

Stock Span Problem Using Stack in DSA Rust - Practice Problems & Challenges

Choose your learning style10 modes available
Challenge - 5 Problems
🎖️
Stock Span Master
Get all challenges correct to earn this badge!
Test your skills under time pressure!
❓ Predict Output
intermediate
2:00remaining
Output of Stock Span Calculation
What is the output of the following Rust code that calculates the stock span for the given prices?
DSA Rust
fn calculate_span(prices: &[i32]) -> Vec<i32> {
    let mut stack: Vec<usize> = Vec::new();
    let mut spans = vec![0; prices.len()];

    for i in 0..prices.len() {
        while !stack.is_empty() && prices[*stack.last().unwrap()] <= prices[i] {
            stack.pop();
        }
        spans[i] = if stack.is_empty() { (i + 1) as i32 } else { (i - *stack.last().unwrap()) as i32 };
        stack.push(i);
    }

    spans
}

fn main() {
    let prices = vec![100, 80, 60, 70, 60, 75, 85];
    let result = calculate_span(&prices);
    println!("{:?}", result);
}
A[7, 6, 5, 4, 3, 2, 1]
B[1, 1, 1, 1, 1, 1, 1]
C[1, 2, 3, 4, 5, 6, 7]
D[1, 1, 1, 2, 1, 4, 6]
Attempts:
2 left
💡 Hint
Remember, the span for a day is the count of consecutive days before it with price less or equal to current price.
🧠 Conceptual
intermediate
1:30remaining
Understanding Stack Usage in Stock Span
Why do we use a stack to solve the Stock Span Problem efficiently?
ATo hold the span values temporarily before final output.
BTo keep track of indices of days with prices greater than the current day for quick span calculation.
CTo reverse the prices array before processing.
DTo store all prices in sorted order for binary search.
Attempts:
2 left
💡 Hint
Think about how to quickly find the previous day with a higher price.
🔧 Debug
advanced
2:00remaining
Identify the Error in Stock Span Code
What error will the following Rust code produce when calculating stock spans?
DSA Rust
fn calculate_span(prices: &[i32]) -> Vec<i32> {
    let mut stack: Vec<usize> = Vec::new();
    let mut spans = vec![0; prices.len()];

    for i in 0..prices.len() {
        while !stack.is_empty() && prices[*stack.last().unwrap()] < prices[i] {
            stack.pop();
        }
        spans[i] = if stack.is_empty() { (i + 1) as i32 } else { (i - *stack.last().unwrap()) as i32 };
        stack.push(i);
    }

    spans
}

fn main() {
    let prices = vec![100, 80, 60, 70, 60, 75, 85];
    let result = calculate_span(&prices);
    println!("{:?}", result);
}
AThe code outputs incorrect spans because it uses '<' instead of '<=' in the while condition
BThe code runs correctly and outputs [1, 1, 1, 2, 1, 4, 6]
CThe code causes a panic due to stack underflow
DThe code has a syntax error due to missing semicolon
Attempts:
2 left
💡 Hint
Check the comparison operator in the while loop condition.
❓ Predict Output
advanced
2:00remaining
Output of Stock Span for All Increasing Prices
What is the output of the stock span function for strictly increasing prices?
DSA Rust
fn calculate_span(prices: &[i32]) -> Vec<i32> {
    let mut stack: Vec<usize> = Vec::new();
    let mut spans = vec![0; prices.len()];

    for i in 0..prices.len() {
        while !stack.is_empty() && prices[*stack.last().unwrap()] <= prices[i] {
            stack.pop();
        }
        spans[i] = if stack.is_empty() { (i + 1) as i32 } else { (i - *stack.last().unwrap()) as i32 };
        stack.push(i);
    }

    spans
}

fn main() {
    let prices = vec![10, 20, 30, 40, 50];
    let result = calculate_span(&prices);
    println!("{:?}", result);
}
A[1, 2, 3, 4, 5]
B[5, 4, 3, 2, 1]
C[1, 1, 1, 1, 1]
D[1, 2, 1, 2, 1]
Attempts:
2 left
💡 Hint
In strictly increasing prices, each day's price is higher than all previous days.
🧠 Conceptual
expert
1:30remaining
Time Complexity of Stock Span Algorithm Using Stack
What is the time complexity of the stock span algorithm implemented using a stack for n days of prices?
AO(n^2) because each price is compared with all previous prices
BO(n log n) due to sorting involved in the algorithm
CO(n) because each element is pushed and popped at most once
DO(1) since the stack operations are constant time
Attempts:
2 left
💡 Hint
Consider how many times each price index is pushed and popped from the stack.

Practice

(1/5)
1. What does the Stock Span Problem calculate for each day in a list of stock prices?
easy
A. The number of consecutive days ending with the current day with a price less than or equal to the current day's price
B. The maximum stock price in the entire list
C. The minimum stock price in the entire list
D. The difference between the current day's price and the previous day's price

Solution

  1. Step 1: Understand the problem definition

    The Stock Span Problem finds, for each day, the length of consecutive days ending on that day where prices are less than or equal to the current day's price.
  2. Step 2: Clarify what is calculated per day

    It counts days backward until a higher price is found, including the current day.
  3. Final Answer:

    The number of consecutive days ending with the current day with a price less than or equal to the current day's price -> Option A
  4. Quick Check:

    Span counts consecutive lower/equal prices [OK]
Hint: Span counts days with price ≤ current day price [OK]
Common Mistakes:
  • Confusing span with max or min price
  • Counting all previous days instead of consecutive ones
  • Calculating price differences instead of counts
2. Which Rust data structure is most suitable to efficiently solve the Stock Span Problem?
easy
A. LinkedList
B. Vector (Vec) used as a stack
C. HashMap
D. BinaryHeap

Solution

  1. Step 1: Identify the need for last-in-first-out access

    The Stock Span Problem requires checking previous days' prices in reverse order, which fits stack behavior.
  2. Step 2: Choose Rust's stack implementation

    Rust's Vec can be used as a stack with push and pop operations efficiently.
  3. Final Answer:

    Vector (Vec) used as a stack -> Option B
  4. Quick Check:

    Vec as stack fits LIFO for span calculation [OK]
Hint: Use Vec as stack for efficient push/pop [OK]
Common Mistakes:
  • Using HashMap which is unordered
  • Using LinkedList which is less efficient
  • Using BinaryHeap which is for priority, not order
3. What is the output span array for the stock prices [100, 80, 60, 70, 60, 75, 85] using the Stock Span algorithm?
medium
A. [1, 1, 1, 2, 1, 4, 6]
B. [1, 2, 3, 4, 5, 6, 7]
C. [1, 1, 2, 2, 3, 3, 4]
D. [7, 6, 5, 4, 3, 2, 1]

Solution

  1. Step 1: Calculate span for each price

    Day 0: 100 -> span 1 (no previous)
    Day 1: 80 < 100 -> span 1
    Day 2: 60 < 80 -> span 1
    Day 3: 70 > 60 -> span 2 (includes day 2)
    Day 4: 60 < 70 -> span 1
    Day 5: 75 > 60, 70 -> span 4 (includes days 4,3,2)
    Day 6: 85 > 75, 70, 60, 80 -> span 6 (includes days 5,4,3,2,1)
  2. Step 2: Confirm final span array

    The spans are [1, 1, 1, 2, 1, 4, 6].
  3. Final Answer:

    [1, 1, 1, 2, 1, 4, 6] -> Option A
  4. Quick Check:

    Span array matches calculated values [OK]
Hint: Count consecutive previous days with price ≤ current [OK]
Common Mistakes:
  • Counting all previous days instead of consecutive
  • Mixing up indices when calculating spans
  • Assuming spans always increase
4. Given this Rust snippet for Stock Span, what is the bug?
let mut stack: Vec<usize> = Vec::new();
let mut span = vec![0; prices.len()];
for i in 0..prices.len() {
    while !stack.is_empty() && prices[*stack.last().unwrap()] < prices[i] {
        stack.pop();
    }
    span[i] = if stack.is_empty() { i + 1 } else { i - stack.last().unwrap() };
    stack.push(i);
}
medium
A. The comparison should be <= instead of < in the while condition
B. The stack should store prices, not indices
C. The span calculation subtracts without dereferencing the last stack element
D. The span vector is initialized with zeros instead of ones

Solution

  1. Step 1: Analyze span calculation line

    span[i] = if stack.is_empty() { i + 1 } else { i - stack.last().unwrap() } uses stack.last().unwrap() without dereferencing, so it subtracts usize - &usize causing a type error or wrong calculation.
  2. Step 2: Correct dereferencing needed

    It should be i - *stack.last().unwrap() to get the usize value from reference.
  3. Final Answer:

    The span calculation subtracts without dereferencing the last stack element -> Option C
  4. Quick Check:

    Dereference stack.last() for correct subtraction [OK]
Hint: Dereference stack.last() before subtraction [OK]
Common Mistakes:
  • Using < instead of <= (not critical here)
  • Not dereferencing stack.last() causing errors
  • Initializing span with zeros is correct here
  • Stack must store indices, not prices
5. How would you modify the Stock Span algorithm to handle a stream of stock prices arriving one by one, efficiently updating the span each time?
hard
A. Store all prices in a vector and recalculate spans from scratch each time
B. Use a hash map to store price frequencies and compute span from frequencies
C. Use a queue to store prices and calculate span by counting elements
D. Use a stack to store pairs of (price, span) and update span by accumulating popped spans

Solution

  1. Step 1: Understand streaming requirement

    For streaming prices, we must update span without reprocessing all previous data.
  2. Step 2: Use stack with (price, span) pairs

    Store each price with its span. When a new price arrives, pop all smaller prices and add their spans to current span, then push new pair.
  3. Step 3: Efficient update

    This approach allows O(1) amortized time per new price, updating span incrementally.
  4. Final Answer:

    Use a stack to store pairs of (price, span) and update span by accumulating popped spans -> Option D
  5. Quick Check:

    Stack with (price, span) pairs for streaming [OK]
Hint: Accumulate spans while popping smaller prices in stack [OK]
Common Mistakes:
  • Recalculating spans from scratch each time (inefficient)
  • Using queue which doesn't support needed access pattern
  • Using hash map which doesn't track order
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