日期:2014-05-20  浏览次数:20756 次

回复"一著名软件公司的java笔试算法题"有兴趣请进
一著名软件公司的java笔试算法题!

算法程序题:
        该公司笔试题就1个,要求在10分钟内作完。
        题目如下:用1、2、2、3、4、5这六个数字,用java写一个main函数,打印出所有不同的排列,如:512234、412345等,要求: "4 "不能在第三位, "3 "与 "5 "不能相连。
这是javaliu2006   ()的帖子内容.
我写了一个程序,得到结果是396个,但是我看回复的兄弟们有说198的还有216的,我也搞不清楚哪个对的,请高手判断一下吧.

源程序如下:
public   class   MathTest
{
  public   static   void   main(String   args[])
  {
    String[]   a   =   { "1 ", "2 ", "2 ", "3 ", "4 ", "5 "};
      int   m   =   0;
        for   (int   i1   =   0;   i1 <a.length;   i1++)
        {
          for   (int   i2   =   0;   i2 <a.length;   i2++)
          {
            if((i2==i1)||(i1==3&&i2==5)||(i1==5&&i2==3))   continue;
for   (int   i3   =   0;   i3 <a.length;   i3++)
{
  if((i3==i1)||(i3==i2)||(i3==3&&i2==5)||(i3==5&&i2==3)||i3==4)continue;
  for   (int   i4   =   0;   i4 <a.length;   i4++)
  {
    if((i4==i1)||(i4==i2)||(i4==i3)||(i4==3&&i3==5)||(i4==5&&i3==3))continue;
    for   (int   i5   =   0;   i5 <a.length;   i5++)
    {
      if((i5==i4)||(i5==i3)||(i5==i2)||(i5==i1)||(i5==3&&i4==5)||(i5==5&&i4==3))continue;
      for   (int   i6   =   0;   i6 <a.length;   i6++)
      {
        if((i6==i5)||(i6==i4)||(i6==i3)||(i6==i2)||(i6==i1)||(i6==3&&i5==5)||(i6==5&&i5==3))continue;
        System.out.println   (a[i1]+a[i2]+a[i3]+a[i4]+a[i5]+a[i6]);
        m   =   m+1;
      }
    }
}
                }
              }
            }
  System.out.println   ( "count   "+m);
      }
}

方便大家判断我把结果也贴上
122345
122543
123245
123254
123425
123452
125234
125243
125423
125432
122345
.
.
.
542231
542312
542321
543122
543122
543212
543221
543212
543221
count   396

------解决方案--------------------
~计算结果肯定是198个!
~wxg1008(嘻嘻哈哈)在加上的部分算错了:c31*p33*2=36(4确定,35捆绑算一个书,这样先把35位置确定c31,剩下三个数全排列p33,最后35交换*2〕这样总数396/2=198
~楼主忽略了所给的六个数中有两个“2”,这样每个六位数楼主都统计了两次~