一著名软件公司的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”,这样每个六位数楼主都统计了两次~