全排列:字典序(网易笔试)

思想: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;
}

猜你喜欢

转载自blog.csdn.net/liugg2016/article/details/81747396