1 把问题归结为图结构的遍历问题。实际上6个数字就是六个结点,把六个结点连接成无向连通图,对于每一个结点求这个图形的遍历路径,所有结点的遍历路径就是最后对这6个数字的排列组合结果集。
2 显然这个结果集还未达到题目的要求。从以下几个方面考虑:
采用二维数组定义图结构,最后的代码是:
import java.util.Iterator;
import java.util.TreeSet;
public class TestQuestion {
private String[] b = new String[]{"1", "2", "2", "3", "4", "5"};
private int n = b.length;
private boolean[] visited = new boolean[n];
visited =falsh;
private int[][] a = new int[n][n];
private String result = "";
private TreeSet TreeSet = new TreeSet();
public static void main(String[] args) {
new TestQuestion().start();
}
private void start() {
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
if (i == j) {
a[i][j] = 0;
} else {
}
}
}a[3][5] = 0;
a[5][3] = 0;
for (int i = 0; i < n; i++) {
}
Iterator it = set.iterator();
while (it.hasNext()) {
String string = (String) it.next();
if (string.indexOf("4") != 2) {
System.out.println(string);
}
}
}
private void depthFirstSearch(int startIndex) {
visited[startIndex] = true;
result = result + b[startIndex];
if (result.length() == n) {
TreeSet .add(result);
}
for(int j = 0; j < n; j++) {
if (a[startIndex][j] == 1 && visited[j] == false) {
depthFirstSearch(j);
} else {
continue;
}
}
}
}
求:5个不同数的和小于100的不重复组合的个数.
很明显,1-100中,5个不同数的和,最小的为1+2+3+4+5=15,最大的为96+97+98+99+100=490,由于数值的连续性,就可以知道所有的和都在15,16,... ,489,490之间。为了叙述方便,暂且设这个序列为F,设每个和出现的次数为R
如果已F(n)为坐标横轴,R(N)为坐标纵轴,不难想象,图像将大约是一个倒“V”字形
现在我们感兴趣的是F(n)出现的次数,即R(n)
然后我们列出一下比较简单的组合:
(算式略)
F(0) = 15, 出现次数是1, 即 R(0) = 1
F(1) = 16, 出现次数是1,即 R(1) = 1
。。。
F(75) = 100, 出现次数不知道,R(100) = ?
那么本题的问题就是求 数列 R(n) 的前76项只和,即 R(0) + R(1) + ... + R(75)
好,现在我们才开始考虑编程实现。
您一定想到了,我们编程的目的就是求R(n), 而且,也可以肯定,其中必然要用到递归调用
R(n)的公式可以通过归纳推理出来,然后再用数学归纳法证明,都是高中的数学知识。
好了,懒得再往下数了。。。其实最实用的方法还是楼上的方法,从分析到出结果,不到5分钟时间。面试的时候经常会碰到类似的题目,考的是你的思路,,,...当然你也可以从实用性上来力推楼上的方法,永远是使用第一