2015创发科技校园招聘笔试题——排列和组合的算法实现

递归输出序列的全排列

1. 一个数的全排列就是本身
2.首先看最后两个数4, 5。它们的全排列为4 5和5 4, 即以4开头4和自己交换的5的全排列和4和5交换以5开头的4的全排列。
3.再看后三个数3, 4, 5。它们的全排列为3 4 5、3 5 4、 4 3 5、 4 5 3、 5 3 4、 5 4 3 六组数。即以3开头的和4,5的全排列的组合、3和4交换以4开头的和3,5的全排列的组合和3和5交换以5开头的和3,4的全排列的组合.
求全排列
void FullArray(char* array, int array_size, unsigned int index)// index子全排列的起点
{
         if(index>= array_size)
         {
                   for(unsignedint i = 0; i < array_size; ++i)
                   {
                            cout<< array[i] << ' ';
                   }
 
                   cout<< '\n';
 
                   return;
         }
 
         for(unsignedint i = index; i < array_size; ++i)
         {
                   swap(array,i, index);
 
                   FullArray(array,array_size, index + 1);
 
                   swap(array,i, index);
         }
}

http://blog.sina.com.cn/s/blog_662234020101azp7.html

首先假设有 ABCDEF这6个字符的字符串S,现在要找出3个字符的所有组合;

思路如下:

首先我们找到这个字符组合中一定包含A字符的组合,那么A字符肯定就定下来了,即包含S中第一个字符的组合,然后以剩下的字符串BCDEF作为新的字符串,找出所有的2个字符的组合,那就得到了A包含的所有组合了是吧。。

然后我们就可以省去A了,因为包含A的所有的组合都找到了,所以我们又开始以BCDEF这个字符串找出所有的3个字符的组合;

那么做法和上面一样,又以第一个为指定的字符,CDEF进行找出所有2个字符的组合。这样包含B开头的所有字符组合也找完了吧‘

依次遍历下去,达到E的时候,不能再进行了,因为剩余长度小于3个了。

以上就是我们的方法;

当然找2个字符组合的也是利用上面的方法递归进行。

那么就这样就OK了;

void combine(char *source,char *result,int n)
{
	int len=strlen(source);
	if(n==0)//找到n个的时候,输出结果
	{
		printf("%s\n",result);
	}
	else
	{
		int i;
		int j;
		for(j=0;*(result+j)!='\0';j++);//j目的是为了当前第n轮的字符插入到result的末尾,即算出末尾的那个位置
		for(i=0;i<len;i++)//确保source不会越界
		{
			*(result+j)=*source;//设置result
			*(result+j+1)='\0'; //为result的下一个设置结束符合,否则下一轮的j会有错;
			source++;  //为这一轮的起始位置往后移动一个位置。
			combine(source,result,n-1); //以下一个位置作为N-1轮的起始位置。
		}
	}
}




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值