[LeetCode] 670. 最大交换

143 阅读1分钟

👉 “Offer 驾到,掘友接招!我正在参与2022春招打卡活动点击查看 活动详情

670. 最大交换

难度:中等

给定一个非负整数,你至多可以交换一次数字中的任意两位。返回你能得到的最大值。

示例 1 :

输入: 2736
输出: 7236
解释: 交换数字2和数字7。

示例 2 :

输入: 9973
输出: 9973
解释: 不需要交换。

注意:

  1. 给定数字的范围是 [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;
    }
};