阅读265 返回首页    go 阿里云 go 技术社区[云栖]


【试练】某公司面试试题

该公司笔试题就1个,要求在10分钟内作完。
题目如下:用1、2、2、3、4、5这六个数字,写一个main函数,打印出所有不同的排列,
如:512234、412325等,要求:"4"不能在第三位,"3"与"5"不能相连。请问这题怎么做呢?

 

 

以前学过全排列的实现方法,但是记不太清,因为数据比较少,我用递归解决了;

答案组合很多,就不一一贴出了

 

 

代码:

#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;
struct node
{
    int num,flag;   
}a[6];
int db[10];
double number=0;
void Fun(int n,int sum,int before)
{
     int i;
     if((n==5&&before==3)||(n==5&&before==3))
     return;
     if(sum==6)
     {
       db[sum]=n;
       if(db[3]==4)
       return;
       for(i=1;i<=6;i++)
       printf("%d",db[i]);
       puts("");
       number++;
       return;
     }
     
     db[sum]=n;
     for(i=1;i<=6;i++)
     {
       if(a[i].flag==0)
       { 
         a[i].flag=1;
         Fun(a[i].num,sum+1,n);
         a[i].flag=0;
       }
     }
     return;
}
int main()
{
    int i;
    a[1].num=1;
    a[2].num=2;
    a[3].num=2;
    a[4].num=3;
    a[5].num=4;
    a[6].num=5;
    for(i=1;i<=6;i++)
    a[i].flag=0;
    for(i=1;i<=6;i++)
    {
       a[i].flag=1;
       Fun(a[i].num,1,-1);
       a[i].flag=0;
    }
    printf("一共有%.0lf种组合符合要求",number);

    return 0;
}


最后一共有498种组合符合要求。

5个数一共有6*5*4*3*2*1=720种情况,看样子不符合情况的有720-498=222种


纯全排序代码:

#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;
struct node
{
    int num,flag;   
}a[6];
int db[10];
double number=0;
void Fun(int n,int sum,int before)
{
     int i;
     if(sum==6)
     {
       db[sum]=n;
       for(i=1;i<=6;i++)
       printf("%d",db[i]);
       printf("\n");
       number++;
       return;
     }
     
     db[sum]=n;
     for(i=1;i<=6;i++)
     {
       if(a[i].flag==0)
       { 
         a[i].flag=1;
         Fun(a[i].num,sum+1,n);
         a[i].flag=0;
       }
     }
     return;
}
int main()
{
    int i;
    a[1].num=1;
    a[2].num=2;
    a[3].num=3;
    a[4].num=4;
    a[5].num=5;
    a[6].num=6;
    for(i=1;i<=6;i++)
    a[i].flag=0;
    for(i=1;i<=6;i++)
    {
       a[i].flag=1;
       Fun(a[i].num,1,-1);
       a[i].flag=0;
    }
    printf("一共有%.0lf种组合符合要求",number);
    return 0;
}


1,2,3,4全排列测试结果:

1234
1243
1324
1342
1423
1432
2134
2143
2314
2341
2413
2431
3124
3142
3214
3241
3412
3421
4123
4132
4213
4231
4312
4321
一共有24种组合符合要求

 

最后更新:2017-04-03 12:56:20

  上一篇:go UITableViewCell的separatorInset属性
  下一篇:go 封装printf函数,针对工程中不同的模块(can,gps, gsm)进行调试输出