给定一个非负整数,你至多可以交换一次数字中的任意两位。返回你能得到的最大值。
示例 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;
}
}
};