全排列和组合

最近准备M$面试,练习写了很多基础的code,很多是以前想了想没什么思路就放弃的题,如果面试过了,我会把剩下的陆续的发上来。

这个排列组合算法参数有点多,不过是原创的偷笑,我觉得这两个算法组合在一起还能产生更多的题目,所以就先放上来,备份一下。

没什么测试,只是试了两个组数证明大概思路应该没问题,就过了,时间紧迫啊!


全排列

void Perm(char str[], int len, char result[], int index)
{
	assert(str!=NULL);
	assert(result!=NULL);
	assert(len>=0);
	assert(index>=0);
	
	if(index==len)// get & print the result
	{
		for(int i=0;i<len;i++)
		{
			printf("%c ", result[i]);
		}
		printf("\n");
		return;
	}

	int j=0;
	for(int i=0;i<len;i++)
	{
		while(str[j]==-1 && j<len)j++;
		if(j==len)return; // all element has been used
		result[index] = str[j];
		str[j] = -1; // this element in using
		Perm(str, len, result, index+1);
		str[j] = result[index]; // revert back
		j++; // this element has been used
	}
}

void PermTest()
{
	/*char str[5] = {'a','b','c','d','e'};
	char result[5];
	Perm(str, 5, result,0);*/
	char str[3] = {'a','b','c'};
	char result[3];
	Perm(str, 3, result,0);
}

组合

void Combine(char str[], int n, int m, int index, char result[], int resultIndex, int resultLen)
{// str - data, index - current data we are reading, resultIndex - the index of result which we are combining
	assert(str!=NULL);
	assert(result!=NULL);

	if((resultLen - resultIndex) > (n-index)) return; // don't have enough elements to combine

	if(m==0)
	{
		for(int i=0;i<resultIndex;i++)
		{
			printf("%c ", result[i]);
		}
		printf("\n");
		return;
	}

	for(int i=index;i<n;i++)
	{
		result[resultIndex] = str[i];
		Combine(str, n, m-1, i+1, result, resultIndex+1, resultLen);
	}
}

void CombineTest()
{
	char str[5] = {'a','b','c','d','e'};
	char result[3];
	Combine(str, 5, 3, 0, result, 0, 3);
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值