一、670. 最大交换【中】
1、题目:
给定一个非负整数,你至多可以交换一次数字中的任意两位。返回你能得到的最大值。
来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/maximum-swap/
2、思路一(错误):
粗略的想法:将最大的那个数放到第一个就行。失败的案例显然表示:若第一个数字已经是最大,那就要把第一个之后最大的数字和第二个交换;若第二个数字已经最大,那就找到第三个…以此类推。
代码:
//s:O() t:O()
class Solution {
public:
int maximumSwap(int num) {
string s = to_string(num);
int max = -1,pos = 0;
for(int i=0;i<s.size();i++){
if(int(s[i]-'0')>max){
max = int(s[i]-'0');
pos = i;
}
}
s[pos] = s[0];
s[0] = max+'0';
return atoi(s.c_str());
}
};
3、思路二
- 创建两个数组,第一个origin按位存放原始数字,第二个数组按顺序存放原始数字
- 从origin最高位以i循环,如果origin[i]和sorted[i]相同,即表示该位已经最大,不需要被换,当且仅当不相等时,表示后续的数字才需要被更换。
例子:
代码:
//s:O() t:O()
class Solution {
public:
int maximumSwap(int num) {
int thenum = num;
int current;
vector<int> sorted; // 第一个数组 排序所有数字
vector<int> origin; // 第二个数据 保持原数字
// 按位记录各位数字
while(thenum!=0){
current = thenum%10;
sorted.push_back(current);
origin.push_back(current);
thenum/=10;
}
// 从小到大排序sorted
sort(sorted.begin(),sorted.end());
int flag = 0; // 找到了不是数字最大的最高位 的标志
// pos1 即应该被交换的位置
// pos2 最大的位置
int max = -1,pos1 = sorted.size(),pos2 = sorted.size();
for(int i=sorted.size()-1;i>=0;i--){
if(flag == 0){
if(sorted[i]==origin[i]){
pos2 = i;
continue;
}else{
pos2 = i;
flag = 1;
}
}
if(origin[i]>=max){
max = origin[i];
pos1 = i;
}
}
// 只要可以交换,就交换
if(pos2 !=sorted.size() && pos1 !=sorted.size()){
origin[pos1] = origin[pos2];
origin[pos2] = max;
}
// 开始按位处理结果
int result = origin[0];
int mul = 10;
for(int i=1;i<origin.size();i++){
result = origin[i]*mul+result;
mul *=10;
}
return result;
}
};