📖 Scenario: You are working on a feature for a puzzle game where players can see the next possible arrangement of numbers on a board. The board is represented as an array of numbers. You need to find the next permutation of this array to show the next possible move.
🎯 Goal: Build a Go program that finds the next permutation of an integer array. If the array is the highest possible permutation, rearrange it to the lowest (sorted ascending).
📋 What You'll Learn
Create an integer slice called nums with the exact values 1, 2, 3
Create an integer variable called i to find the first decreasing element from the right
Implement the next permutation logic using a loop and swaps
Print the nums slice after applying the next permutation
💡 Why This Matters
🌍 Real World
Next permutation logic is used in puzzle games, combinatorial problems, and generating sequences in lexicographical order.
💼 Career
Understanding permutations and array manipulation is important for coding interviews and algorithm design in software development.
Progress0 / 4 steps
1
Create the initial array
Create an integer slice called nums with the exact values 1, 2, 3.
DSA Go
Hint
Use nums := []int{1, 2, 3} to create the slice.
2
Find the first decreasing element from the right
Create an integer variable called i and use a for loop to find the first index from the right where nums[i] < nums[i+1]. Start i from len(nums) - 2 and decrease it until this condition is met or i < 0.
DSA Go
Hint
Use a for loop with condition i >= 0 && nums[i] >= nums[i+1] and decrease i inside the loop.
3
Implement the next permutation logic
If i >= 0, create an integer variable j starting from len(nums) - 1. Use a for loop to find the first index j from the right where nums[j] > nums[i]. Swap nums[i] and nums[j]. Then reverse the sub-slice of nums from i+1 to the end.
DSA Go
Hint
Use nested loops and swaps to find j, swap nums[i] and nums[j], then reverse the sub-slice from i+1 to the end.
4
Print the next permutation
Print the nums slice using fmt.Println(nums) to display the next permutation.
DSA Go
Hint
Use fmt.Println(nums) to print the slice.
Practice
(1/5)
1. What does the next permutation of an array represent?
easy
A. The next lexicographically greater arrangement of the array elements
B. The array sorted in ascending order
C. The array reversed
D. The smallest element moved to the front
Solution
Step 1: Understand the concept of permutation order
Permutations can be ordered lexicographically like words in a dictionary.
Step 2: Define next permutation
The next permutation is the next arrangement that is just larger than the current one in this order.
Final Answer:
The next lexicographically greater arrangement of the array elements -> Option A
Quick Check:
Next permutation = next bigger arrangement [OK]
Hint: Think of next permutation as next dictionary word [OK]
Common Mistakes:
Confusing next permutation with sorting
Thinking it always reverses the array
Assuming it moves smallest element to front
2. Which Go code snippet correctly swaps two elements nums[i] and nums[j] in an array?
easy
A. swap(nums[i], nums[j])
B. temp = nums[i]; nums[i] = nums[j]; nums[j] = temp
C. nums[i], nums[j] = nums[j], nums[i]
D. nums[i] = nums[j]; nums[j] = nums[i]
Solution
Step 1: Recall Go multiple assignment syntax
Go allows swapping two variables in one line using multiple assignment.
Step 2: Identify correct swap syntax
The syntax nums[i], nums[j] = nums[j], nums[i] swaps values correctly without temporary variable.
Final Answer:
nums[i], nums[j] = nums[j], nums[i] -> Option C
Quick Check:
Go swap uses multiple assignment [OK]
Hint: Use Go's multiple assignment for swapping [OK]
Common Mistakes:
Using undefined swap function
Forgetting temporary variable in manual swap
Assigning both to same value causing loss
3. What is the output of the following Go code that finds the next permutation of nums := []int{1, 3, 2}?
func nextPermutation(nums []int) {
i := len(nums) - 2
for i >= 0 && nums[i] >= nums[i+1] {
i--
}
if i >= 0 {
j := len(nums) - 1
for nums[j] <= nums[i] {
j--
}
nums[i], nums[j] = nums[j], nums[i]
}
left, right := i+1, len(nums)-1
for left < right {
nums[left], nums[right] = nums[right], nums[left]
left++
right--
}
}
func main() {
nums := []int{1, 3, 2}
nextPermutation(nums)
fmt.Println(nums)
}
medium
A. [1, 2, 3]
B. [2, 1, 3]
C. [1, 3, 2]
D. [3, 1, 2]
Solution
Step 1: Find first decreasing element from right
Starting from index 1 (value 3), check if nums[i] >= nums[i+1]. At i=1, 3 >= 2 true, i=0, 1 >= 3 false, so i=0.
Step 2: Find element just larger than nums[i]
From right, find j where nums[j] > nums[i] (nums[0]=1). j=2 (value 2) > 1, swap nums[0] and nums[2]. Array becomes [2,3,1]. Reverse suffix from i+1=1 to end: reverse [3,1] to [1,3]. Final array: [2,1,3].
Final Answer:
[2, 1, 3] -> Option B
Quick Check:
Next permutation of [1,3,2] = [2,1,3] [OK]
Hint: Swap and reverse suffix after first decreasing index [OK]
Common Mistakes:
Not reversing suffix after swap
Swapping wrong elements
Stopping at first decreasing element without swap
4. Identify the bug in this Go code snippet for next permutation:
func nextPermutation(nums []int) {
i := len(nums) - 1
for i > 0 && nums[i] <= nums[i-1] {
i--
}
if i > 0 {
j := len(nums) - 1
for nums[j] <= nums[i-1] {
j--
}
nums[i-1], nums[j] = nums[j], nums[i-1]
}
left, right := i, len(nums)-1
for left < right {
nums[left], nums[right] = nums[right], nums[left]
left++
right--
}
}
medium
A. The initial index i should start at len(nums) - 2, not len(nums) - 1
B. The swap should be between nums[i] and nums[j], not nums[i-1] and nums[j]
C. The reversal should start from i-1, not i
D. The loop conditions should use < instead of >
Solution
Step 1: Check starting index for finding first decreasing element
The algorithm must start checking from second last element (len(nums)-2) to compare with next element.
Step 2: Identify impact of starting at len(nums)-1
Starting at len(nums)-1 compares last element with out-of-range index, causing incorrect behavior or skipping needed checks.
Final Answer:
The initial index i should start at len(nums) - 2, not len(nums) - 1 -> Option A
Quick Check:
Start i at len(nums)-2 for correct next permutation [OK]
Hint: Start i at second last index to find decreasing pair [OK]
Common Mistakes:
Starting i at last index causing index errors
Swapping wrong elements
Incorrect reversal range
5. Given an array nums := []int{3, 2, 1}, what will be the next permutation after applying the standard next permutation algorithm? Explain why.
hard
A. [3, 2, 1] because it is already the highest permutation
B. [3, 1, 2] because swapping first and last elements gives next permutation
C. [2, 3, 1] because reversing the array gives next permutation
D. [1, 2, 3] because the array is in descending order, so next permutation is the lowest ascending order
Solution
Step 1: Check if array is in descending order
Array [3, 2, 1] is strictly descending, meaning it is the highest permutation possible.
Step 2: Apply next permutation rule for highest permutation
When highest permutation is reached, next permutation is the lowest ascending order, which is [1, 2, 3].
Final Answer:
[1, 2, 3] because the array is in descending order, so next permutation is the lowest ascending order -> Option D
Quick Check:
Descending array next permutation = ascending array [OK]
Hint: If descending, next permutation is ascending sorted array [OK]
Common Mistakes:
Thinking next permutation is same as current if descending
Swapping wrong elements instead of reversing whole array
Not resetting to lowest permutation after highest
Recommended
Ready to prove it?
Pass the test and this pattern moves unknownstrongwhile earning +1 Grip toward your certificate.