Bird
Raised Fist0
DSA Rustprogramming~10 mins

Next Permutation of Array in DSA Rust - Interactive Practice

Choose your learning style10 modes available
Practice - 5 Tasks
Answer the questions below
1fill in blank
easy

Complete the code to find the next permutation by swapping the right elements.

DSA Rust
fn next_permutation(nums: &mut Vec<i32>) {
    let mut i = nums.len() as i32 - 2;
    while i >= 0 && nums[i as usize] >= nums[i as usize + 1] {
        i -= [1];
    }
}
Drag options to blanks, or click blank then click option'
A2
B1
C-1
D0
Attempts:
3 left
💡 Hint
Common Mistakes
Using 0 will cause an infinite loop.
Using 2 skips elements and misses the correct pivot.
2fill in blank
medium

Complete the code to find the index j to swap with i.

DSA Rust
fn next_permutation(nums: &mut Vec<i32>) {
    let mut i = nums.len() as i32 - 2;
    while i >= 0 && nums[i as usize] >= nums[i as usize + 1] {
        i -= 1;
    }
    if i >= 0 {
        let mut j = nums.len() as i32 - 1;
        while nums[j as usize] <= nums[i as usize] {
            j -= [1];
        }
    }
}
Drag options to blanks, or click blank then click option'
A1
B2
C-1
D0
Attempts:
3 left
💡 Hint
Common Mistakes
Using 0 causes an infinite loop.
Using 2 skips elements and misses the correct j.
3fill in blank
hard

Fix the error in swapping elements at i and j.

DSA Rust
fn next_permutation(nums: &mut Vec<i32>) {
    let mut i = nums.len() as i32 - 2;
    while i >= 0 && nums[i as usize] >= nums[i as usize + 1] {
        i -= 1;
    }
    if i >= 0 {
        let mut j = nums.len() as i32 - 1;
        while nums[j as usize] <= nums[i as usize] {
            j -= 1;
        }
        nums.swap(i as usize, [1]);
    }
}
Drag options to blanks, or click blank then click option'
Ai as usize
B0
Cj as usize
Dnums.len() - 1
Attempts:
3 left
💡 Hint
Common Mistakes
Swapping i with itself does nothing.
Swapping with 0 or last index is incorrect here.
4fill in blank
hard

Fill both blanks to reverse the suffix after index i.

DSA Rust
fn next_permutation(nums: &mut Vec<i32>) {
    let mut i = nums.len() as i32 - 2;
    while i >= 0 && nums[i as usize] >= nums[i as usize + 1] {
        i -= 1;
    }
    if i >= 0 {
        let mut j = nums.len() as i32 - 1;
        while nums[j as usize] <= nums[i as usize] {
            j -= 1;
        }
        nums.swap(i as usize, j as usize);
    }
    let mut left = (i + 1) as usize;
    let mut right = nums.len() - 1;
    while left < right {
        nums.swap([1], [2]);
        left += 1;
        right -= 1;
    }
}
Drag options to blanks, or click blank then click option'
Aleft
Bright
Ci as usize
Dj as usize
Attempts:
3 left
💡 Hint
Common Mistakes
Using i or j here is incorrect because we reverse the suffix after i.
Swapping wrong indices breaks the order.
5fill in blank
hard

Fill all three blanks to complete the next_permutation function.

DSA Rust
fn next_permutation(nums: &mut Vec<i32>) {
    let mut i = nums.len() as i32 - 2;
    while i >= 0 && nums[i as usize] >= nums[i as usize + 1] {
        i -= [1];
    }
    if i >= 0 {
        let mut j = nums.len() as i32 - 1;
        while nums[j as usize] <= nums[i as usize] {
            j -= [2];
        }
        nums.swap(i as usize, j as usize);
    }
    let mut left = (i + 1) as usize;
    let mut right = nums.len() - 1;
    while left < right {
        nums.swap([3], right);
        left += 1;
        right -= 1;
    }
}
Drag options to blanks, or click blank then click option'
A1
Bj as usize
Cleft
D0
Attempts:
3 left
💡 Hint
Common Mistakes
Using 0 or wrong indices causes infinite loops or wrong swaps.
Not reversing the suffix breaks the next permutation logic.

Practice

(1/5)
1. What does the next_permutation algorithm do to an array of numbers?
easy
A. It rearranges the array to the next lexicographically greater permutation.
B. It sorts the array in ascending order.
C. It reverses the array.
D. It finds the maximum element in the array.

Solution

  1. Step 1: Understand the purpose of next_permutation

    The algorithm finds the next arrangement of elements that is just larger than the current one in dictionary order.
  2. Step 2: Compare with other options

    Sorting or reversing changes order but does not guarantee the next lexicographical permutation. Finding max element is unrelated.
  3. Final Answer:

    It rearranges the array to the next lexicographically greater permutation. -> Option A
  4. Quick Check:

    Next permutation = next lexicographically greater order [OK]
Hint: Next permutation means next bigger order arrangement [OK]
Common Mistakes:
  • Confusing next permutation with sorting
  • Thinking it reverses the array always
  • Assuming it finds max element
2. Which of the following Rust code snippets correctly swaps two elements in a vector nums at indices i and j?
easy
A. nums.swap(i, j) -> ();
B. nums[i] = nums[j]; nums[j] = nums[i];
C. nums.swap(i, j);
D. nums.swap_elements(i, j);

Solution

  1. Step 1: Recall Rust vector swap method

    Rust's standard Vec<T> has a method swap(i, j) to exchange elements at indices i and j.
  2. Step 2: Check other options for correctness

    nums[i] = nums[j]; nums[j] = nums[i]; incorrectly assigns values without temporary storage, causing wrong swap. nums.swap_elements(i, j); uses a non-existent method. nums.swap(i, j) -> (); has invalid syntax.
  3. Final Answer:

    nums.swap(i, j); -> Option C
  4. Quick Check:

    Correct swap method = nums.swap(i, j) [OK]
Hint: Use nums.swap(i, j) to swap elements in Rust vector [OK]
Common Mistakes:
  • Assigning without temp variable causing overwrite
  • Using non-existent methods
  • Incorrect syntax with arrows or extra symbols
3. What is the output of the following Rust code that finds the next permutation of nums = vec![1, 3, 2]?
let mut nums = vec![1, 3, 2];
if next_permutation(&mut nums) {
    println!("{:?}", nums);
} else {
    println!("No next permutation");
}

fn next_permutation(nums: &mut Vec<i32>) -> bool {
    let n = nums.len();
    if n < 2 { return false; }
    let mut i = n - 2;
    while i != usize::MAX && nums[i] >= nums[i + 1] {
        if i == 0 { break; }
        i -= 1;
    }
    if i == usize::MAX || nums[i] >= nums[i + 1] {
        nums.reverse();
        return false;
    }
    let mut j = n - 1;
    while nums[j] <= nums[i] {
        j -= 1;
    }
    nums.swap(i, j);
    nums[i + 1..].reverse();
    true
}
medium
A. [2, 1, 3]
B. [1, 2, 3]
C. [1, 3, 2]
D. No next permutation

Solution

  1. Step 1: Identify pivot index i

    Starting from right, find i where nums[i] < nums[i+1]. For [1,3,2], i=0 because 1 < 3.
  2. Step 2: Find j to swap with i

    From right, find j where nums[j] > nums[i]. Here j=2 (value 2 > 1).
  3. Step 3: Swap and reverse suffix

    Swap nums[0] and nums[2]: [2,3,1]. Then reverse suffix after i: reverse [3,1] to [1,3]. Result: [2,1,3].
  4. Step 4: Check code logic carefully

    Code breaks loop early if i=0 and condition met, so i=0 is pivot. But code returns false and reverses if no pivot found. Here pivot found, so returns true and prints new nums.
  5. Final Answer:

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

    Next permutation of [1,3,2] = [2,1,3] [OK]
Hint: Find pivot i, swap with j, reverse suffix [OK]
Common Mistakes:
  • Not reversing suffix after swap
  • Wrong pivot index calculation
  • Confusing when to return false
4. The following Rust function attempts to implement next permutation but has a bug. What is the bug?
fn next_permutation(nums: &mut Vec<i32>) -> bool {
    let n = nums.len();
    if n < 2 { return false; }
    let mut i = n - 2;
    while nums[i] >= nums[i + 1] {
        i -= 1;
    }
    if nums[i] >= nums[i + 1] {
        nums.reverse();
        return false;
    }
    let mut j = n - 1;
    while nums[j] <= nums[i] {
        j -= 1;
    }
    nums.swap(i, j);
    nums[i + 1..].reverse();
    true
}
medium
A. The suffix reversal is missing.
B. The loop misses checking when i == 0, causing panic on underflow.
C. The swap method is used incorrectly.
D. The function does not return a boolean.

Solution

  1. Step 1: Analyze the while loop condition

    The loop uses while nums[i] >= nums[i + 1] and decrements i. When i reaches 0 and condition holds, next decrement causes underflow (usize wraps to large number).
  2. Step 2: Check consequences

    This causes panic or incorrect behavior. The correct approach is to use i != usize::MAX or check before decrementing to avoid underflow.
  3. Final Answer:

    The loop misses checking when i == 0, causing panic on underflow. -> Option B
  4. Quick Check:

    Loop underflow bug = missing i == 0 check [OK]
Hint: Check loop index underflow when decrementing unsigned integers [OK]
Common Mistakes:
  • Ignoring unsigned integer underflow
  • Incorrect swap usage
  • Forgetting to reverse suffix
5. Given a vector nums = vec![3, 2, 1], which is the highest permutation, what will be the state of nums after applying the next permutation function that returns false when no next permutation exists?
hard
A. [3, 2, 1]
B. Original vector unchanged
C. Empty vector
D. [1, 2, 3]

Solution

  1. Step 1: Identify if next permutation exists

    For [3, 2, 1], the array is in descending order, which is the highest permutation. No next permutation exists.
  2. Step 2: Apply algorithm behavior when no next permutation

    The algorithm reverses the entire array to the lowest permutation and returns false.
  3. Final Answer:

    [1, 2, 3] -> Option D
  4. Quick Check:

    Highest permutation reversed = lowest permutation [OK]
Hint: No next permutation means reverse to lowest order [OK]
Common Mistakes:
  • Expecting no change when no next permutation
  • Returning empty vector incorrectly
  • Confusing highest and lowest permutations
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