算法思想**

该公司笔试题就1个,要求在10分钟内作完。

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

  基本思路:
1 把问题归结为图结构的遍历问题。实际上6个数字就是六个结点,把六个结点连接成无向连通图,对于每一个结点求这个图形的遍历路径,所有结点的遍历路径就是最后对这6个数字的排列组合结果集。
2 显然这个结果集还未达到题目的要求。从以下几个方面考虑:
  1. 3,5不能相连:实际要求这个连通图的结点3,5之间不能连通, 可在构造图结构时就满足改条件,然后再遍历图。
  2. 不能有重复: 考虑到有两个2,明显会存在重复结果,可以把结果集放在TreeSet中过滤重复结果
  3. 4不能在第三位: 仍旧在结果集中去除满足此条件的结果。

采用二维数组定义图结构,最后的代码是:

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[i][j] = 1;
}
}
}a[3][5] = 0;
a[5][3] = 0;
for (int i = 0; i < n; i++) {
    this.depthFirstSearch(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;
}
}
    result = result.substring(0, result.length() -1);
    visited[startIndex] = false;
}
}

一道java面试题,算法,求大家帮忙解答

1-100中,
求: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分钟时间。面试的时候经常会碰到类似的题目,考的是你的思路,,,...当然你也可以从实用性上来力推楼上的方法,永远是使用第一


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值