SamLove

来源:互联网 发布:2016美国2月非农数据 编辑:程序博客网 时间:2024/06/05 04:41

======================================================
注:本文源代码点此下载
======================================================

java笔试

原题如下:用1、2、2、3、4、5这六个数字,用java写一个程序,打印出所有不同的排列,如:512234、412345等,要求:"4"不能在第三位,"3"与"5"不能相连。

解题思路:

很明显,这是一个递归算法。我们可以排列将这6个数按从小到大的顺序排一下,如果是1,2,3,4,5,6,那么会有1*2*3*4*5*6= 6!=720个递增的数。但如果是1,2,2,3,4,5,那么在这720个数中一定会有相同的数对出现(由于在这6个数中只有两个数两同,也就是说,如果有重复的数,那么一定是一对数,如122345会出现两次)。

排列的基本规则是分步进行。也就是说,要排列上面6个数,首先应该选择第一个数,这第一个数可以选择这6个数中的任意一个,如选择1.第二步是选择第二个数,这第二个数不能再选择已经选过的数,如1.因此,它只能从后面5个数中选择。如选择2。以此类推。

我们也可以在程序中模拟这一过程。源程序如下:

public class test1

{

private int[] numbers = new int[]

{ 1, 2, 3, 3, 4, 5 };

public int n;

private string lastresult = "";

private boolean validate(string s)

{

if (s.compareto(lastresult)0)

return false;

if (s.charat(2) == '4')

return false;

if (s.indexof("35") >= 0 || s.indexof("53") >= 0)

return false;

return true;

}

public void list(string index, string result)

{

for (int i = 0; inumbers.length; i++)

{

if (index.indexof(i + 48)0)

{

string s = result + string.valueof(numbers[i]);

if (s.length() == numbers.length)

{

if (validate(s))

{

system.out.println(s);

lastresult = s;

n++;

}

break;

}

list(index + string.valueof(i), s);

}

}

}

public static void main(string[] args)

{

test1 t = new test1();

t.list("", "");

system.out.println("总数:" + t.n);

}

}

其中list函数是这个算法的核心函数。index参数表示已经选择过的数,用numbers数组的索引表示。如index="012",表示numbers的前三个数已经被选择,也表示应该选择第四个数了,而这第四个数应该从后三个数中选择。result参数表示临时的数字组合(这个数字组合最多是5个数字,因为,如果到了6个数字,就表示已经有一个结果产生了)。在默认情况下index和result的值都是""。

在validate中使用了if (s.compareto(lastresult) 关注我收藏该文与我联系

posted on 2010-04-26 21:54samlove 阅读(0) 评论(0)编辑 收藏


======================================================
在最后,我邀请大家参加新浪APP,就是新浪免费送大家的一个空间,支持PHP+MySql,免费二级域名,免费域名绑定 这个是我邀请的地址,您通过这个链接注册即为我的好友,并获赠云豆500个,价值5元哦!短网址是http://t.cn/SXOiLh我创建的小站每天访客已经达到2000+了,每天挂广告赚50+元哦,呵呵,饭钱不愁了,\(^o^)/
原创粉丝点击