LC 670. 最大交换

670. 最大交换

难度: 中等

题目大意 :

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

提示

  1. 给定数字的范围是 [0, 10^8]

示例 1 :

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

分析1

因为题目给定了要交换的数字的个数,而且数的最大的位数就是8位,所以可以直接暴力枚举即可

暴力枚举

代码实现

class Solution {
public:
    int maximumSwap(int num) {
        string s = to_string(num);
        int res = num, n = s.size();
        for (int i = 0; i < n; i ++) {
            for (int j = i + 1; j < n; j ++) {
                swap(s[i], s[j]);
                res = max(res, stoi(s));
                swap(s[i], s[j]);
            }
        }
        return res;
    }
};

时间复杂度: O ( n 2 ) O(n^2) O(n2) (n 是数字的位数n <= 8)

  • int stoi(string s),将一个string类型的转化为int类型的,类似的库函数还有stol,stoll等等

分析2

考虑如果没有限制次数,那么最大的数字就是数位从大到小排序,所以我们只需要将原来的数字和最大的数字进行对比,如果不一样,那么把这个数字交换过来就行,这样一定能保证是最大的

贪心 + 排序

class Solution {
public:
    int maximumSwap(int num) {
        string s = to_string (num), t = s;
        sort(t.rbegin(), t.rend());
        for (int i = 0; i < s.size(); i ++) {
            if (s[i] != t[i]) {
                swap(s[i], *find(s.rbegin(), s.rend(), t[i]));
                break;
            }
        }
        return stoi(s);
    }
};

时间复杂度: O ( n l o g n ) O(nlogn) O(nlogn) (n 是数字的位数 n <= 8)

  • 排序sort默认是从小到大排序,我们使用rbegin和rend就可以将序列右往左从小到大排序,也就是从左往右是从大到小排序

结束了

你可能感兴趣的:(算法,数据结构,c++,面试,leetcode)