leetcode670. 最大交换
给定一个非负整数,你至多可以交换一次数字中的任意两位。返回你能得到的最大值。
示例 1 :
输入: 2736
输出: 7236
解释: 交换数字2和数字7。
思路一:找出当前位置后面的比他的那个数
时间复杂度n^2
代码:
class Solution {
public void swap(char[] nums, int i, int j) {
char temp = nums[i];
nums[i] = nums[j];
nums[j] = temp;
}
public int maximumSwap(int num) {
if (num < 10) return num;
//将数字拆分
char[] nums = String.valueOf(num).toCharArray();
int max;
for (int i = 0; i < nums.length-1; i++) {
//记录前面数字的下标
max = i;
//从i的下一个位置找,找到最大的那个数字
for (int j = i+1; j <nums.length; j++) {
//此处要用大于等于,因为如果有两个最大的数值,那么保证前面的大的数字保留,可以使数字更大
if (nums[j] - '0' >= nums[max] - '0') {
max = j;
}
}
//这里要对数字进行比较,而不要对数字下标进行比较,因为如果后面的那个最大的数和当前的位置的数相等就不用替换
if (nums[max]!=nums[i]) {
swap(nums, i, max);
break;
}
}
return Integer.parseInt(new String(nums));
}
}
思路二:给数组加索引,记录当前位置后面的比他大的数的位置,如果没有就记录为-1.
class Solution {
public void swap(char[] nums, int i, int j) {
char temp = nums[i];
nums[i] = nums[j];
nums[j] = temp;
}
public int maximumSwap(int num) {
if(num<10) return num;
char[] chars=String.valueOf(num).toCharArray();
int max=chars.length-1;
int[] flag=new int[chars.length];
//从右往左加索引
for(int i=flag.length-1;i>=0;i--){
//比这个数字大,那么max就要进行更新,否则就记录索引为max
if(chars[i]-'0'>chars[max]-'0'){
flag[i]=-1;
max=i;
}else{
flag[i]=max;
}
}
for(int i=0;i<chars.length;i++){
//从左往右遍历,索引不为-1,并且这个是数值的大小不等于索引位置的数值大小(防止出现98368这种情况)
if(flag[i]!=-1&&chars[i]!=chars[flag[i]]){
swap(chars,i,flag[i]);
break;
}
}
return Integer.parseInt(new String(chars));
}
}