交换两个数字使结果尽可能大(string的一些用法)

传送门
来源:牛客网

题目描述
给你一个整数,你可以选择操作一次(也可以不操作)交换该数字中任意两位上的数字,使你的结果数尽可能大。
输入描述:
第一行输入一个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;
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值