思想:1、string s 首先找到s[i]<s[i+1]的最大值,即代码中max_index,如果没有找到,则说明现在为最大值(结束)
2、在max_index+1至s.size()(不包括)中,寻找大于s[max_index]的最小值,并记录下标,即代码中min_index
3、交换s[max_index]和s[min_index]
4、翻转s[max_index+1]至s[s.size()-1],得到最终结果
例如:768321
max_index=1 ;
min_index=2;
交换之后为 786321,翻转之后为781236
#include<fstream>
#include<iostream>
#include<string>
#include<algorithm>
using namespace std;
bool FullArray(string& s)
{
int i = 0;
int max_index = -1;
while (i < s.size()-1){
if (s[i] < s[i + 1]){//进行一次扫描,找到最大max_ndex a[i]<a[i+1]
max_index = max(max_index, i);
}
i++;
}
if (max_index == -1){
return false;
}
int j = max_index+1;
char min_num = s[j];
int min_index = 0;
for (; j < s.size(); j++){
if (s[j]>s[max_index]){//找到比s[max_index]大的最小值的下标
if (min_num >=s[j])
min_index = j;
}
}
//cout << s << endl;
swap(s[max_index], s[min_index]);
//cout << s << endl;
reverse(s.begin() + max_index + 1, s.end());
return true;
}
int main()
{
//char nums[9] = "12345678";
string s = "12345";
/*cout<<FullArray(s)<<endl;
cout << s << endl;*/
ofstream fout("string.txt",ios::out);//清空文件,并与追加的形式添加到文件中
//fout.seekp(0);
bool flag = true;
while (flag){
fout << s << endl;
flag=FullArray(s);
}
system("pause");
return 0;
}