百度2012校招笔试题之全排列与组合

算法题目:

求一个全排列函数:

如p([1,2,3])输出:[123],[132],[213],[231],[321],[323].

思路:采用字典序的排序的方法 

代码实现:

void swap(char *a,char *b)
{
     char temp;
     temp=*a;
     *a=*b;
     *b=temp;
}

void reverse(char *dic ,int start,int end)
{
     int i=start,j=end;
     for(;i<=j;i++,j--)
          swap(dic[i],dic[j]);
}
void perm (char *dic)
{
      bool flag;

      while()
      {
          Print(dic);
          flag = true;
          int i,l;
          for(i=size ; i>=1;i--)
          {
            if(dic[i]>dic[i-1])
            {
                flag = false;break;
            }
          }
    
       if(flag) break;
    
       for(l=size;l>i-1;l--)
       { 
            if(dic[l]>dic[i-1])
                 break;
       }
    
       swap(dic[i-1],dic[l]);
       reverse(dic,i-1,size-1);
     }
}

算法设计

求一个组合函数

如p([1,2,3])输出:[1],[2],[3],[1,2],[2,3],[1,3],[1,2,3]

思路:设一个数组a,数组a中的数必须是0和1当中的一个,将待组合数每一个数关联到数组中,接着按照二进制的规则,对数组a构建成的二进制数一步一步加1,在这个过程中,数组a每次构建一个二进制的数,对应数组为1的待组合数集合当中的数立即输出,构成一次组合,依次类推。

 

 

void cov(int num,int *a,int size)
{
    int mark=num;
    for(int i=size-1;mark!=0;mark/=2,i--)
   {
       if(mark%2)
             a[i]=1;
       else
             a[i]=0;
    }
}

void combine1(char *dic, int size)
{
     int a[size];
     long int max=2*size

     for(long int i=1;i<=max;i++)
     {
        for(int j=0;j<size;j++)
              a[j]=0;
        cov(i,a,size);
        for(int j=0;j<size;j++)
       {
             if(a[j]==1)
            {
                 printf(“%c,”,dic[j]);
             }
        }
        printf(“\n”);
     }
}

 注:以上还可以用字典树实现效率或更高些

 

原文地址:https://www.cnblogs.com/biyeymyhjob/p/2589738.html