您的位置:首页 > 其它

全排列和组合

2012-11-18 11:48 169 查看
最近准备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);
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: