1.题目(中等)原题链接
给定一个非负整数,你 至多 可以交换一次数字中的任意两位。返回你能得到的最大值。
示例 1 :
输入: 2736
输出: 7236
解释: 交换数字2和数字7。
示例 2 :
输入: 9973
输出: 9973
解释: 不需要交换。
注意:
给定数字的范围是 \([0, 10^8]\)
2.解题思路
贪心,数字转换成字符串,从大到小排序,与原字符串从左到右对比,遇到不相同的就从原字符串倒着寻找这个字符,交换即可。
3.c++代码
class Solution {
public:
int maximumSwap(int num) {
auto s=to_string(num);
auto t=s;
ranges::sort(t,greater<>());
int n=s.length();
for(int i=0;i<n;i++){
if(s[i]!=t[i]){
int index=s.find_last_of(t[i]);
swap(s[i],s[index]);
break;
}
}
return stoi(s);
}
};
4.复杂度分析
- 时间复杂度:\(O(lognum\cdot loglognum)\)。
- 空间复杂度:\(O(lognum)\)。