简单的说一下思路吧:
这道题不只是找个最大数交换一下位置那么简单,其实是要找“没有排好序情况下的最大数”并尽可能将其往前一位放。
举个例子: 1234,我们会选择4和1交换。变成4231。
4231,我们会选择3和2交换。变成4321。
4312,我们会选择2和1交换。变成4321。
发现了吗?关键就是在于找到第一个没有排好序的最大数进行交换,然后结束程序。
这道题实在不懂的自己下去手画以下,做题的first step是思考。
#include<bits/stdc++.h>
using namespace std;
void find(string &str)
{
//排序
string dir=str;
int len=dir.length();
long long mark[1000]={0};
for(int i=0;i<=len-1;i++)
{
mark[str[i]-'0']=i;//mark[1]=0;
// cout<<mark[str[i]-'0']<<'#';
}
for(int i=0; i<len-1; i++)
{
for(int j=0; j<len-i-1; j++)
{
if(dir[j] < dir[j+1]) // 降序排序
{
swap(dir[j], dir[j+1]);
}
}
}
//现在实现了dir[i]=str[i],也就是dir[0]=4;
for(int i=0;str[i]!='\0';i++)
{
char tran;
if(dir[i]!=str[i])
{
tran=str[i];
str[i]=dir[i];
str[mark[dir[i]-'0']]=tran;
cout<<str;//我现在知道i,我要找下标。
return ;
}
}
cout<<str;
}
int main()
{
int t;string n;
cin>>t;
for(int i=1;i<=t;i++)
{
cin>>n;
find(n);
cout<<endl;
}
}

京公网安备 11010502036488号