给定一个非负整数,你至多可以交换一次数字中的任意两位。返回你能得到的最大值。
示例 1 :
输入: 2736 输出: 7236 解释: 交换数字2和数字7。示例 2 :
输入: 9973 输出: 9973 解释: 不需要交换。注意:
- 给定数字的范围是 [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<n;i++){for(int j=i+1;j<n;j++){swap(charArry[i],charArry[j]);maxNum = max(maxNum,stoi(charArry));swap(charArry[i],charArry[j]);}}return maxNum;}
};
方法二:贪心
从右向左记录一个最大数,和最左边的比它小的数交换
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;}}
};