全排列和組合

最近準備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萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章