给定一个非负整数,你至多可以交换一次数字中的任意两位。返回你能得到的最大值。
public class Solution {
public int maximumSwap(int num) {
// 统计每个数出现的次数,用于找最大值
int[] count = new int[10];
// 将入参转为数组
int[] numberToArray = new int[8];
// 记录入参长度
int length = 0;
int n = num;
while (n > 0) {
int current = n % 10;
numberToArray[length++] = current;
count[current]++;
n /= 10;
}
// 最高位在最后
int currentIndex = length - 1;
// 最大值为9
int maxIndex = 9;
while (maxIndex >= 0) {
// 寻找当前最大值
while (maxIndex >= 0 && count[maxIndex] == 0){
maxIndex--;
}
// 如果当前最大值和当前最高位符合,继续找
if (currentIndex >= 0 && maxIndex == numberToArray[currentIndex]) {
count[maxIndex]--;
currentIndex--;
}else {
break;
}
}
// 符合最大数要求,直接返回
if (currentIndex == 0) {
return num;
}
// 交换找到的最高位和其后最大值
for (int i = 0; i < currentIndex; i++) {
if (numberToArray[i] == maxIndex) {
int temp = numberToArray[i];
numberToArray[i] = numberToArray[currentIndex];
numberToArray[currentIndex] = temp;
}
}
// 组成结果返回
int result = 0;
for (int i = length - 1; i >= 0; i--) {
result *= 10;
result += numberToArray[i];
}
return result;
}
}
class Solution {
public:
int maximumSwap(int num) {
// 记录每个数出现的次数
int count[10] = {0};
// 入参转数组
int numberToArray[8] = {0};
// 记录入参长度
int length = 0;
int n = num;
while (n > 0) {
int current = n % 10;
numberToArray[length++] = current;
count[current]++;
n /= 10;
}
// 最高位在最后
int currentIndex = length - 1;
// 最大值为9
int maxIndex = 9;
while (maxIndex >= 0) {
// 寻找当前最大值
while (maxIndex >= 0 && count[maxIndex] == 0){
maxIndex--;
}
// 如果当前最大值和当前最高位符合,继续找
if (currentIndex >= 0 && maxIndex == numberToArray[currentIndex]) {
count[maxIndex]--;
currentIndex--;
}else {
break;
}
}
// 符合最大数要求,直接返回
if (currentIndex == 0) {
return num;
}
// 交换找到的最高位和其后最大值
for (int i = 0; i < currentIndex; i++) {
if (numberToArray[i] == maxIndex) {
int temp = numberToArray[i];
numberToArray[i] = numberToArray[currentIndex];
numberToArray[currentIndex] = temp;
}
}
// 组成结果返回
int result = 0;
for (int i = length - 1; i >= 0; i--) {
result *= 10;
result += numberToArray[i];
}
return result;
}
};