题目
1095. 最大的交换
给定一个非负整数,你可以交换两个数位至多一次来获得最大的合法的数。返回最大的合法的你能够获得的数。
样例
样例1:
输入: 2736
输出: 7236
解释: 交换数字2和数字7.
样例2:
输入: 9973
输出: 9973
解释: 不用交换.
注意事项
给定的数字在 [0, 10^8] 内。
解答
代码
public int maximumSwap(int num) {
// Write your code here
String str = new Integer(num).toString();
char[] charArr = str.toCharArray();
//获得数据位数
int count = charArr.length;
//确认需要交换的数
int max = 0;
int maxP = 0;
for (int i = 0; i < count; i++) {
max = 0;
for (int j = count - 1; j >= i; j--) {
int num1 = Character.getNumericValue(charArr[j]);
if (max < num1) {
max = num1;
maxP = j;
}
}
if (maxP != i) {
break;
}
}
//将交换数尽量往改为换
char tempC;
for (int i = 0; i < count; i++) {
int num1 = Character.getNumericValue(charArr[i]);
if (num1 < max && maxP > i) {
tempC = charArr[i];
charArr[i] = charArr[maxP];
charArr[maxP] = tempC;
break;
}
}
return Integer.parseInt(new String(charArr));
}
思路
我开始使用并没有使用char数组来存储,而是使用了%依次取出每个位上的数,但是最后失败了.
现在整理思路.获得数据位数,通过循环得到需要换的是那个数,通过循环从高位依次遍历,找到最合适的交换位置
注意
在寻找最优的交换数的时候,我们的第一个for负责的是,取得当前最高位的数值,第二个for负责的是,将随后的数与最高位的数比较,如果存在比最高位的数还大的数,我们就记录下这个数与数的位,并跳出随后的循环.
在后边的寻找最优的交换位置的地方,我们要保证两个点.
一是要从最高位开始,查找比我这个数要小的值,而是这个值的位,要在交换数之前