给定一个非负整数,你至多可以交换一次数字中的任意两位。返回你能得到的最大值。
示例 1 :
输入: 2736
输出: 7236
解释: 交换数字2和数字7。
示例 2 :
输入: 9973
输出: 9973
解释: 不需要交换。
示例 2 :
输入: 98368
输出: 98863
解释: 交换3和最后一个8
思路:从左边的第一位为前,后置位有大于前置位的交换都会变大,假设存在一个前置位小于一个后置位,该前置位的下标应尽量靠前,后置位首先要尽量大其次下标尽量靠后。
1.将整数保存进v数组(倒序),并创建一个数组index保存原始下标,对index按大小排序,排完后大的值会在后面
2.对index从后往前遍历,判断有该位置上是否需要调换(index[i]代表原始下标,i位上应该元素应该等于i才不用调换,代表该个整数是能组成最大值)
class Solution {
public:
int maximumSwap(int num) {
int ret=0;
//存入数组
vector<int> v;
while(num>=1)
{
v.push_back(num%10);
num/=10;
}
//调整顺序
vector<int> index(v);
iota(index.begin(),index.end(),0);
//按v中元素递增,排下标(要得是稳定排序,且要让靠后的元素先被选到所以是<=)
stable_sort(index.begin(),index.end(),[=](int a,int b)->bool{return v[index[a]]<=v[index[b]];});
//最大元素的在index最后,要先选择到低位上可以调换的
for(int i=index.size()-1;i>=0;i--)
{
//该位序上的下标该进行调换时:
if(index[i]!=i)
{
//这两个位置上的元素一样大,则要让后置位的元素继续被选择到
if(v[i]==v[index[i]])
{
swap(index[i],index[i-1]);
continue;
}
swap(v[i],v[index[i]]);
break;
}
}
for(int i=index.size()-1;i>=0;i--)
{
ret*=10;
ret+=v[i];
}
return ret;
}
};