题目

方法一
- 核心就一句话:就是把第一个小数和它后面最大的大数进行交换, 小数要尽量在高位,大数尽量在低位。
- 计算最后一次出现的数的索引。然后,从左到右扫描数字时,如果将来有较大的数字,我们将用最大的数字交换;如果有多个这样的数字,我们将用最开始遇到的数字交换。
class Solution {
public int maximumSwap(int num) {
String str = String.valueOf(num);
char[] arr = str.toCharArray();
int[] last = new int[10];
for (int i = 0; i < arr.length; i++) {
last[arr[i] - '0'] = i;
}
for (int i = 0; i < arr.length; i++) {
for (int j = last.length - 1; j >= 0; j--) {
if (j > arr[i] - '0' && last[j] > i) {
swap(arr, i, last[j]);
return Integer.parseInt(new String(arr));
}
}
}
return num;
}
public void swap(char[] arr, int m, int n) {
char tmp = arr[m];
arr[m] = arr[n];
arr[n] = tmp;
}
}
方法二
- 将num转换为数组
- 拷贝数组并排序(升序),得到arrSorted
- 从arrSorted最大值开始依次和arr比较,找到第一个不相等的数字在arr中位置,即应该被换位更大数字的位置。
- 再扫一遍arr,找到那个更大数字的位置,swap。
- 注意拷贝数组不能直接=,应该用
arrNew = Arrays.copyOf(oldArr, length)
class Solution {
public int maximumSwap(int num) {
String str = String.valueOf(num);
int length = str.length();
char[] arr = str.toCharArray();
char[] arrSorted = Arrays.copyOf(arr, length);
Arrays.sort(arrSorted);
int indexSmall = -1;
int numBig = -1;
for (int i = 0; i < length; i++) {
if (arrSorted[length - 1 - i] != arr[i]) {
numBig = arrSorted[length - 1 - i];
indexSmall = i;
break;
}
}
if (indexSmall == -1) {
return num;
}
int indexBig = -1;
for (int i = 0; i < length; i++) {
if (arr[i] == numBig) {
indexBig = i;
}
}
char tmp = arr[indexBig];
arr[indexBig] = arr[indexSmall];
arr[indexSmall] = tmp;
int res = 0;
for (int i = 0; i < length; i++) {
res = res * 10 + arr[i] -'0';
}
return res;
}
}