<LeetCode>670. 最大交换

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

示例 1 :

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

示例 2 :

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

注意:

  1. 给定数字的范围是 [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,说明最大的数字不在最高位,那么应该交换。

好,下面问题来了,交换的对象是什么?应该选择下标较大的那个数字,即本例中的下标为2的9而不是下标为1的9。因为如果交换下标为1的9,就是9192,而交换下标为2的9就是9912。

那我们知道了,交换的两个参数一个是下标为2的9,还有一个是什么呢?当然就是这一位上本来存在的那个数字,即1.

好了,去看代码吧~

猜你喜欢

转载自blog.csdn.net/w8253497062015/article/details/80897104