力扣刷题第八天 最大交换

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

示例 1 :

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

示例 2 :

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

注意:

  1. 给定数字的范围是 [0, 10^8]
方法一:直接遍历

 

       由于对于整数 num的十进制数字位长最长为 8 位,任意两个数字交换一次最多有 28 种不同的交换方法,因此我们可以尝试遍历所有可能的数字交换方法即可,并找到交换后的最大数字即可。

       我们将数字存储为长度为 n 的列表,其中 n 为整数 num的十进制位数的长度。对于位置为 (i, j)的每个候选交换,我们交换数字并记录组成的新数字是否大于当前答案;
        对于前导零的问题,我们也不需要特殊处理。由于数字只有 8 位,所以我们不必考虑交换后溢出的风险;

class Solution {
public:
    int maximumSwap(int num) {
        string charArry = to_string(num);
        int n = charArry.size();
        int maxNum = num;
        for(int i=0;i

 方法二:贪心

从右向左记录一个最大数,和最左边的比它小的数交换

class Solution {
public:
    int maximumSwap(int num) {
        string charArray = to_string(num);
        int n = charArray.size();
        int maxIdx = n - 1;
        int idx1 = -1, idx2 = -1;
        for (int i = n - 1; i >= 0; i--) {
            if (charArray[i] > charArray[maxIdx]) {
                maxIdx = i;
            } else if (charArray[i] < charArray[maxIdx]) {
                idx1 = i;
                idx2 = maxIdx;
            }
        }
        if (idx1 >= 0) {
            swap(charArray[idx1], charArray[idx2]);
            return stoi(charArray);
        } else {
            return num;
        }
    }
};

你可能感兴趣的:(贪心,leetcode,算法,职场和发展)