现在将会写一系列各种IT公司招聘的笔试面试题博客(自己学习和讨论)。

欢迎大家提出好的意见。共同讨论,共同进度。


一.字符串或数字的全排列问题(百度笔试题)

题目:

求一个全排列函数,如P([1,2,3])输出:

【123】、【132】、【213】、【231】、【321】、【312】

解答:


方法一:

一个数或(字符)的全排列是其本身,比如1的全排列就是1

两个数或(字符)的全排列是将其交换,比如12的全排列是12,21

三个数的全排列:1.可以将第一个数不变,后面进行全排列,1不变,23全排列,结果为123,132

                                        2.将第二个数与第一个数交换,然后将后面的数全排列,2不变,13全排列,结果为,213,231

                                        3.姜第三个数与第一个数交换,然后将后面的数全排列,3,不变,21排列,结果为 321,312

       四个以此类推……

这是一种递归的方法,将大的问题,逐步小化。



方法二:

运用STL中的求下一个排列的思想。

        1.运用STL的sort()将数组进行排序。

         2.运用next_permutation();求下一个排列



代码实现:

方法一:

#include <iostream>

using namespace std;

void swap(char& a,char& b)
{
	char temp;
	temp=a;
	a=b;
	b=temp;



}

void permutation(char* str,int k,int m)
{
	if (k>m)
	{
		cout<<str<<endl;
	}
	else
	{
		for (int i=k;i<=m;i++)
		{
			swap(*(str+k),*(str+i));
			permutation(str,k+1,m);
			swap(*(str+k),*(str+i));

		}
	}
}

int main()
{
	char str[]="123";

	permutation(str,0,2);
	return 0;
}

方法二:
#include <iostream>

#include <algorithm>

using namespace std;


void permutation(char* str, int k, int m)
{
	sort(str,str+strlen(str));

	int i=k;

	do 
	{
		cout<<str<<endl;


	} while (next_permutation(str,str+strlen(str)));
}

int main()
{
	char str[]="123";
	permutation(str,0,2);
	return 0;
}