给定一个非负整数,你至多可以交换一次数字中的任意两位。返回你能得到的最大值。
示例 1 :
输入: 2736 输出: 7236 解释: 交换数字2和数字7。
示例 2 :
输入: 9973 输出: 9973 解释: 不需要交换。
注意:
- 给定数字的范围是 [0, 108]
class Solution {
public:
int maximumSwap(int num) {
//首先把原来的数字全部搞出来
string str = to_string(num);
vector<pair<int,int>> res;
for(int i=0;i<str.size();i++){
res.push_back(make_pair(str[i]-'0',i));
}
sort(res.begin(),res.end(),[](pair<int,int> a,pair<int,int> b)->
bool{
if(a.first>b.first) return true;
else return false;
});
for(int i=0;i<res.size();i++){
if(res[i].second != i){
int j = i;
while(res[j].first == res[i].first) j++;
j--;
swap(str[res[j].second],str[i]);
break;
}
}
return atoi(str.c_str());
}
};
思路其实很简单,大致是这样的:
对于1992这个数字,只能交换一次,那么最大值应该是9912.
怎么思考的呢?
首先,最高位必须是9。这句话变得更加普遍性一点就是,最高位应该是最大的数字,第二位应该是第二大的数字,第三位应该是第三大的数字,第n位应该是第n大的数字。
但是,对于原始数据,1作为第一位,确实第四大的数字,9作为第2或第3位,却是最大的数字。这就是我们要处理的。
所以,我用pair<int,int>保存了原始的位置,和从大到小排序后的位置。
1992排序后是9921,先看第一位,排序后是9,原始下标为1或2,新下标为0,说明最大的数字不在最高位,那么应该交换。
扫描二维码关注公众号,回复:
3104544 查看本文章
好,下面问题来了,交换的对象是什么?应该选择下标较大的那个数字,即本例中的下标为2的9而不是下标为1的9。因为如果交换下标为1的9,就是9192,而交换下标为2的9就是9912。
那我们知道了,交换的两个参数一个是下标为2的9,还有一个是什么呢?当然就是这一位上本来存在的那个数字,即1.
好了,去看代码吧~