👉 “Offer 驾到,掘友接招!我正在参与2022春招打卡活动点击查看 活动详情。
670. 最大交换
难度:中等
给定一个非负整数,你至多可以交换一次数字中的任意两位。返回你能得到的最大值。
示例 1 :
输入: 2736
输出: 7236
解释: 交换数字2和数字7。
示例 2 :
输入: 9973
输出: 9973
解释: 不需要交换。
注意:
- 给定数字的范围是 [0, 108]
解题思路
贪心思想
- 首先从后向前扫描,记录每个数字出现的
index(最后一次出现) - 然后从前向后扫描,如果在此数字之后有更大的数字,那就用最大的数字来交换
- 只记录最后一次出现的
index,是因为当存在多个更大的数字时,选择最大数字且位置在最后的来进行交换
代码
class Solution {
public:
int maximumSwap(int num) {
string s = to_string(num);
map<char,int> mp;
for(int i = s.size() - 1; i >= 0; i--){
if(mp.count(s[i]) == 0){
mp[s[i]] = i;
}
}
int ans = stoi(s);
for(int i = 0; i < s.size(); i++){
for(char ch = '9'; ch >= '0'; ch--){
if(ch > s[i] and mp.count(ch) and mp[ch] > i){
s[mp[ch]] = s[i];
s[i] = ch;
ans = stoi(s);
return ans;
}
}
}
return ans;
}
};