Bird
Raised Fist0
Rustprogramming~5 mins

Result enum in Rust - Time & Space Complexity

Choose your learning style10 modes available
Time Complexity: Result enum
O(n)
Understanding Time Complexity

When using Rust's Result enum, it's important to know how the time cost changes as your program runs.

We want to see how the time to handle Result values grows with input size.

Scenario Under Consideration

Analyze the time complexity of the following code snippet.


fn process_results(results: &[Result]) -> i32 {
    let mut sum = 0;
    for res in results {
        match res {
            Ok(val) => sum += val,
            Err(_) => continue,
        }
    }
    sum
}
    

This code adds up all the Ok values in a list of Result items, skipping errors.

Identify Repeating Operations

Identify the loops, recursion, array traversals that repeat.

  • Primary operation: Looping through each element in the results slice.
  • How many times: Once for every item in the input list.
How Execution Grows With Input

As the list gets longer, the time to process grows directly with the number of items.

Input Size (n)Approx. Operations
10About 10 checks and sums
100About 100 checks and sums
1000About 1000 checks and sums

Pattern observation: The work grows evenly as the input grows; doubling the input doubles the work.

Final Time Complexity

Time Complexity: O(n)

This means the time to finish grows in a straight line with the number of items to check.

Common Mistake

[X] Wrong: "Matching on each Result is slow and adds extra loops."

[OK] Correct: Matching is done inside the single loop and does not add extra passes; it's just a quick check per item.

Interview Connect

Understanding how simple loops and pattern matching affect time helps you explain your code clearly and shows you know how to reason about performance.

Self-Check

"What if we changed the input from a slice to a nested list of Result values? How would the time complexity change?"

Practice

(1/5)
1. What does the Result enum in Rust represent?
easy
A. A type for storing multiple values in a list
B. A way to loop over numbers
C. A value that can be either success (Ok) or failure (Err)
D. A function that always returns Ok

Solution

  1. Step 1: Understand the purpose of Result

    Result is used to show if an operation succeeded or failed.
  2. Step 2: Identify the two variants

    Ok means success, Err means failure or error.
  3. Final Answer:

    A value that can be either success (Ok) or failure (Err) -> Option C
  4. Quick Check:

    Result = success or failure [OK]
Hint: Remember: Result = Ok (success) or Err (failure) [OK]
Common Mistakes:
  • Thinking Result is a list or collection
  • Confusing Result with loops or arrays
  • Assuming Result always means success
2. Which of the following is the correct way to create a Result with a success value of 10?
easy
A. let x: Result = Result::new(10);
B. let x: Result = Err(10);
C. let x: Result = Ok("10");
D. let x: Result = Ok(10);

Solution

  1. Step 1: Check the correct variant for success

    Success uses Ok, so Ok(10) is correct.
  2. Step 2: Verify the type matches

    The type is Result, so Ok(10) matches i32 for success.
  3. Final Answer:

    let x: Result<i32, &str> = Ok(10); -> Option D
  4. Quick Check:

    Success = Ok(value) [OK]
Hint: Use Ok(value) for success, Err(value) for error [OK]
Common Mistakes:
  • Using Err for success value
  • Mismatching types inside Ok or Err
  • Trying to use Result::Ok instead of Ok directly
3. What will be printed by this Rust code?
fn divide(a: i32, b: i32) -> Result {
    if b == 0 {
        Err(String::from("Divide by zero"))
    } else {
        Ok(a / b)
    }
}

fn main() {
    match divide(10, 2) {
        Ok(result) => println!("Result: {}", result),
        Err(e) => println!("Error: {}", e),
    }
}
medium
A. Result: 0
B. Result: 5
C. Error: Divide by zero
D. Compile error

Solution

  1. Step 1: Check the divide function call

    Calling divide(10, 2) means b is 2, not zero, so it returns Ok(10 / 2) which is Ok(5).
  2. Step 2: Match on the Result

    The match sees Ok(5), so it prints Result: 5.
  3. Final Answer:

    Result: 5 -> Option B
  4. Quick Check:

    Ok(5) prints Result: 5 [OK]
Hint: Match Ok prints result, Err prints error message [OK]
Common Mistakes:
  • Assuming divide by 2 returns error
  • Confusing Ok and Err branches
  • Expecting compile error due to String
4. Identify the error in this Rust code using Result:
fn get_number(flag: bool) -> Result {
    if flag {
        Ok(42)
    } else {
        Err(42)
    }
}
medium
A. The Err variant has wrong type; should be a String
B. The Ok variant should return a String
C. Missing semicolon after Ok(42)
D. Function must return Option not Result

Solution

  1. Step 1: Check the function return type

    The function returns Result<i32, String>, so Ok must hold i32 and Err must hold String.
  2. Step 2: Identify the error in Err(42)

    42 is an integer, but Err expects a String. This causes a type mismatch.
  3. Final Answer:

    The Err variant has wrong type; should be a String -> Option A
  4. Quick Check:

    Err type must match declared error type [OK]
Hint: Err must match error type declared in Result [OK]
Common Mistakes:
  • Using wrong type inside Err
  • Thinking Ok needs String
  • Ignoring type mismatch errors
5. Given a list of strings representing numbers, which Rust code correctly converts them to integers and collects only successful parses using Result handling?
let strings = vec!["10", "abc", "20", "xyz"];
// Fill in the blank:
let numbers: Vec<i32> = strings.iter()
    .map(|s| s.parse::<i32>())
    .__________;
println!("{:?}", numbers);
hard
A. filter_map(Result::ok).collect()
B. filter(|r| r.is_ok()).collect()
C. map(Result::unwrap).collect()
D. collect::()

Solution

  1. Step 1: Understand parse returns Result

    Each s.parse::<i32>() returns Result<i32, _>, so we get an iterator of Results.
  2. Step 2: Use filter_map(Result::ok) to keep only successes

    filter_map(Result::ok) extracts the Ok values and skips errors, then collect() gathers them into a vector.
  3. Final Answer:

    filter_map(Result::ok).collect() -> Option A
  4. Quick Check:

    filter_map(Result::ok) keeps only successful parses [OK]
Hint: Use filter_map(Result::ok) to keep only Ok values [OK]
Common Mistakes:
  • Using filter without extracting Ok values
  • Calling unwrap on all results causing panic
  • Trying to collect without filtering errors
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