1.题目
给定一个非负整数,你至多可以交换一次数字中的任意两位。返回你能得到的最大值。
示例 1 :
输入: 2736
输出: 7236
解释: 交换数字2和数字7。
示例 2 :
输入: 9973
输出: 9973
解释: 不需要交换。
2.解题思路
题意要求至多交换一次,主要有以下几种情况:
(1)暴力解法
思路:从头开始遍历整数各位数字组成的数组,并寻找最大值,并判断最大值索引是否等于当前遍历的位置索引:
- 如果等于,则继续进行遍历
- 如果不等于,则进行交换,停止遍历
(2)贪心算法
思路:由局部最优退出全局最优,随着指针的移动,寻找范围内的最大和最小值,并记录其索引。最优根据索引交换对应位置的值。
3.代码
(1)暴力解法
//解法一:暴力解法
public int maximumSwap(int num) {
//将整数各位数取出
List<Integer> list=new ArrayList<>();
while (num>0){
int x=num%10;
list.add(x);
num=num/10;
}
int index=list.size()-1;
while (index>=0){
int maxIndex=getMax(list,0,index);
if (list.get(maxIndex)!=list.get(index)){
int temp=list.get(index);
list.set(index,list.get(maxIndex));
list.set(maxIndex,temp);
break;
}else {
index--;
}
}
int res=0;
int k=1;
for (int i = 0;i<list.size();i++){
res+=list.get(i)*k;
k=k*10;
}
return res;
}
public int getMax(List<Integer> list,int start,int end){
int max=-1;
int maxIndex=0;
for (;start<=end;start++){
if (list.get(start)>max){
max=list.get(start);
maxIndex=start;
}
}
return maxIndex;
}
(2)贪心算法
public int maximumSwap(int num) {
char[] charArray = String.valueOf(num).toCharArray();
int n = charArray.length;
int maxIdx = n - 1;
int idx1 = -1, idx2 = -1;//记录当前遍历中最大与最小值索引
for (int i = n - 1; i >= 0; i--) {
if (charArray[i] > charArray[maxIdx]) {
maxIdx = i;
} else if (charArray[i] < charArray[maxIdx]) {
idx1 = i;
idx2 = maxIdx;
}
}
if (idx1 >= 0) {
swap(charArray, idx1, idx2);
return Integer.parseInt(new String(charArray));
} else {
return num;
}
}
public void swap(char[] charArray, int i, int j) {
char temp = charArray[i];
charArray[i] = charArray[j];
charArray[j] = temp;
}