将数字作为字符数组考虑会方便很多:
n
u
m
=
>
n
u
m
C
h
a
r
s
num => numChars
num=>numChars,字符数组长度为n
做如下的贪心策略:
遍历字符数组,遍历到numChars[i]
时,去判断numChars[i+1]
到numsChars[n-1
]中是否有大于它的数字,有的话则记录,记录的是大于numChars[i]
的最大值的下标,且是这些最大值中的最后一位。若有记录,则进行交换,可以得到交换后最大的值。
考虑输入:1993
其交换后的最大值为9913,numChars[0]
与numChars[2]
进行交换
代码如下:
public class Solution {
public int maximumSwap(int num) {
char[] numChars = String.valueOf(num).toCharArray();
int n = numChars.length;
for (int i = 0; i < n-1; i++) {
//numChars[i]是否为最大的数值, 如果是则判断下一位
//如果不是则找到后续数字中大于numChars[i]最大的一位,进行交换
char maxChar = numChars[i];
int idx = i;
for (int j = i+1; j < n; j++) {
if(numChars[j] >= maxChar && numChars[j] > numChars[i]){
maxChar = numChars[j];
idx = j;
}
}
if(idx != i){
//说明后续中有大于numChars[i]的值
//进行交换
char temp = numChars[i];
numChars[i] = numChars[idx];
numChars[idx] = temp;
String s = String.valueOf(numChars);
return Integer.parseInt(s);
}
}
return num;
}
}