Given a non-negative integer, you could swap two digits at most once to get the maximum valued number. Return the maximum valued number you could get.
Example 1:
Input: 2736
Output: 7236
Explanation: Swap the number 2 and the number 7.
Example 2:
Input: 9973
Output: 9973
Explanation: No swap.
给出一个数字,可以交换一位,使数字变成尽可能大
思路:
数字变大的途径是把最高位换成最大的数字,如果最高位已经是最大了就要把后面高位换成最大的数字。而且要尽量把最低位的最大数换到前面。
那么就从低位往高位遍历(数字的个位开始,从右至左),更新遇到的最大值,保存最大值所在的index,同时还需要一个指针往前走,遇到比这个最大值小的数字就保存index,找到尽量靠近最高位的比最大值小的数字。然后交换
数字没办法直接遍历每一位,可考虑转换成string或者char array
因为后面要交换数字,string不能做内容的变化,考虑用StringBuilder
但是StringBuilder的运行时间要大于char array,可能是因为stringBuilder.toString()方法需要重新建string再进行copy,开销较大吧,而且中间有string的拼接也是需要重建一个string的
StringBuilder方法
//5ms
public int maximumSwap(int num) {
if(num < 10) {
return num;
}
StringBuilder sNum = new StringBuilder(Integer.toString(num));
int p1 = -1;
int p2 = -1;
int n = sNum.length();
int maxIdx = n - 1;
for(int i = n-2; i >= 0; i--) {
if(sNum.charAt(i) > sNum.charAt(maxIdx)) {
maxIdx = i;
} else if(sNum.charAt(i) < sNum.charAt(maxIdx)){
p1 = i;
p2 = maxIdx;
}
}
if(p1 >= 0) {
char tmp = sNum.charAt(p1);
sNum.replace(p1, p1+1, ""+sNum.charAt(p2));
sNum.replace(p2, p2+1, ""+tmp);
}
return Integer.parseInt(sNum.toString());
}
char array方法
//0ms
public int maximumSwap(int num) {
if(num < 10) {
return num;
}
char[] cNum = Integer.toString(num).toCharArray();
int p1 = -1;
int p2 = -1;
int n = cNum.length;
int maxIdx = n - 1;
for(int i = n-2; i >= 0; i--) {
if(cNum[i] > cNum[maxIdx]) {
maxIdx = i;
} else if(cNum[i] < cNum[maxIdx]) {
p1 = i;
p2 = maxIdx;
}
}
if(p1 >= 0) {
char tmp = cNum[p1];
cNum[p1] = cNum[p2];
cNum[p2] = tmp;
}
return Integer.parseInt(new String(cNum));
}