现在将会写一系列各种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;
}