全排列和组合

最近准备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);
}



发布了150 篇原创文章 · 获赞 2 · 访问量 31万+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章