简单的说一下思路吧:

这道题不只是找个最大数交换一下位置那么简单,其实是要找“没有排好序情况下的最大数”并尽可能将其往前一位放。

举个例子: 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;
	}
}