670. Maximum Swap
Problem Description
You are given an integer num. You can swap two digits at most once to get the maximum valued number.
Return the maximum valued number you can get.
Examples:
Example 1:
Input: num = 2736 Output: 7236 Explanation: Swap the number 2 and the number 7.
Example 2:
Input: num = 9973 Output: 9973 Explanation: No swap.
Constraints:
- 0 ≤ num ≤ 108
Python Solution
class Solution:
def maximumSwap(self, num: int) -> int:
# Convert number to list of digits
digits = list(str(num))
n = len(digits)
# For each digit, find the largest digit that comes after it
last = {int(x): i for i, x in enumerate(digits)}
# Check each position from left to right
for i in range(n):
current = int(digits[i])
# Check all possible digits larger than current
for d in range(9, current, -1):
# If we find a larger digit that comes after current position
if d in last and last[d] > i:
# Swap the digits
digits[i], digits[last[d]] = digits[last[d]], digits[i]
return int(''.join(digits))
return num
Alternative Solution:
class Solution:
def maximumSwap(self, num: int) -> int:
nums = list(str(num))
max_idx = {int(x): i for i, x in enumerate(nums)}
for i, x in enumerate(nums):
for d in range(9, int(x), -1):
if d in max_idx and max_idx[d] > i:
nums[i], nums[max_idx[d]] = nums[max_idx[d]], nums[i]
return int(''.join(nums))
return num
Implementation Notes:
- Time complexity: O(n) where n is number of digits
- Space complexity: O(n) to store the digits
- Uses dictionary to store last occurrence of each digit
Java Solution
class Solution {
public int maximumSwap(int num) {
char[] digits = String.valueOf(num).toCharArray();
int[] last = new int[10];
// Record last position of each digit
for (int i = 0; i < digits.length; i++) {
last[digits[i] - '0'] = i;
}
// Check each position from left to right
for (int i = 0; i < digits.length; i++) {
int currentDigit = digits[i] - '0';
// Look for larger digits
for (int d = 9; d > currentDigit; d--) {
if (last[d] > i) {
// Swap digits
char temp = digits[i];
digits[i] = digits[last[d]];
digits[last[d]] = temp;
return Integer.parseInt(new String(digits));
}
}
}
return num;
}
}
C++ Solution
class Solution {
public:
int maximumSwap(int num) {
string digits = to_string(num);
vector last(10, -1);
// Record last position of each digit
for (int i = 0; i < digits.length(); i++) {
last[digits[i] - '0'] = i;
}
// Check each position from left to right
for (int i = 0; i < digits.length(); i++) {
int currentDigit = digits[i] - '0';
// Look for larger digits
for (int d = 9; d > currentDigit; d--) {
if (last[d] > i) {
// Swap digits
swap(digits[i], digits[last[d]]);
return stoi(digits);
}
}
}
return num;
}
};
JavaScript Solution
/**
* @param {number} num
* @return {number}
*/
var maximumSwap = function(num) {
const digits = String(num).split('');
const last = new Array(10).fill(-1);
// Record last position of each digit
for (let i = 0; i < digits.length; i++) {
last[digits[i]] = i;
}
// Check each position from left to right
for (let i = 0; i < digits.length; i++) {
const currentDigit = parseInt(digits[i]);
// Look for larger digits
for (let d = 9; d > currentDigit; d--) {
if (last[d] > i) {
// Swap digits
[digits[i], digits[last[d]]] = [digits[last[d]], digits[i]];
return parseInt(digits.join(''));
}
}
}
return num;
};
C# Solution
public class Solution {
public int MaximumSwap(int num) {
char[] digits = num.ToString().ToCharArray();
int[] last = new int[10];
// Record last position of each digit
for (int i = 0; i < digits.Length; i++) {
last[digits[i] - '0'] = i;
}
// Check each position from left to right
for (int i = 0; i < digits.Length; i++) {
int currentDigit = digits[i] - '0';
// Look for larger digits
for (int d = 9; d > currentDigit; d--) {
if (last[d] > i) {
// Swap digits
char temp = digits[i];
digits[i] = digits[last[d]];
digits[last[d]] = temp;
return int.Parse(new string(digits));
}
}
}
return num;
}
}
Implementation Notes:
- Uses array to store last occurrence of each digit
- Time complexity: O(n) where n is number of digits
- Space complexity: O(1) since array size is fixed at 10
- Only performs one swap to get maximum value