传送门
来源:牛客网
题目描述
给你一个整数,你可以选择操作一次(也可以不操作)交换该数字中任意两位上的数字,使你的结果数尽可能大。
输入描述:
第一行输入一个T,代表测试的数据个数(T<=1000)
接下来T行,每行输入一个整数a (0<a<=1e8)
输出描述:
对于输入的T组样例,每一组输出一行你的结果数
示例1
输入
复制
1
1234
输出
复制
4231
说明
显然交换1,4位置上的数字会使结果数最大
两种方法:
复杂一点,但是里面包含了一些技巧:
#include <bits/stdc++.h>
using namespace std;
#define inf 0x3f3f3f3f
#define eps 1e-6
typedef long long ll;
int maximumSwap(int num) {
string s = to_string(num);//将数值转换为字符串
string temp(s);//将temp赋为s
int index1 = 0, index2 = 0,index3 = 0;
sort(s.begin(),s.end(),greater<char>());//将它从大到小排序
for(int i = 0;i < s.size(); i++){//从最开始(最高位)开始查找,看是否为组合里的最大值
if(s[i] != temp[i]){//记录不满足时的最大值
index1 = i;
index2 = i;
break;
}
}
for(int i = 0 ; i < temp.size();i++){
if(temp[i] == s[index1]){//查找最大值所在位置
index3 = i;
}
}
char temp1 = temp[index1];//交换
temp[index1] = s[index2];
temp[index3] = temp1;
return stoi(temp);//返回的是int类型
}
int main(){
int n;
cin>>n;
while(n--){
int num;
cin>>num;
cout<<maximumSwap(num)<<endl;
}
return 0;
}
思路简单一点:
#include <bits/stdc++.h>
using namespace std;
#define inf 0x3f3f3f3f
#define eps 1e-6
typedef long long ll;
int main(){
int t;
scanf("%d",&t);
while(t--){
char a[20];
cin>>a;
int len=strlen(a);
int tmp;
for(int i=0;i<len;i++){
tmp=i;
for(int j=tmp+1;j<len;j++){//找最大
if(a[j]>=a[tmp])tmp=j;//注意这里一定要加等于号!!!因为要考虑若出现相同最大值时选最大值越后面的交换后结果越大
}
if(a[tmp]>a[i]&&tmp>i){//交换
int b=a[i];
a[i]=a[tmp];
a[tmp]=b;
break;
}
}
cout<<a<<endl;
}
return 0;
}