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