很有意思的题目,感觉和之前遇到的一道题很像(好像是下一个最大的数? Leetcode560题)
思路:
1.暴力
枚举所有可能的交换情况,然后找一个最大的数(复杂度o(n的平方))
2.优化
保存所有数字的最后出现位置,然后从前往后遍历,一旦在目标数字后有最大的数字(从后往前找) 就进行交换(扫描两次,复杂度o(n))
class Solution {
public int maximumSwap(int num) {
char[] A = Integer.toString(num).toCharArray();
int[] last = new int[10];
for (int i = 0; i < A.length; i++) {
last[A[i] - '0'] = i;
}
for (int i = 0; i < A.length; i++) {
for (int d = 9; d > A[i] - '0'; d--) {
if (last[d] > i) {
char tmp = A[i];
A[i] = A[last[d]];
A[last[d]] = tmp;
return Integer.valueOf(new String(A));
}
}
}
return num;
}
}