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