算法程序题:
该公司笔试题就1个,要求在10分钟内作完。
题目如下:用1、2、2、3、4、5这六个数字,用java写一个main函数,打印出所有不同的排列,如:512234、412345等,要求:"4"不能在第三位,"3"与"5"不能相连。
static int[] bits = new int[] { 1, 2, 3, 4, 5 };
/**
* @param args
*/
public static void main(String[] args) {
sort("", bits);
}
private static void sort(String prefix, int[] a) {
if (a.length == 1) {
System.out.println(prefix + a[0]);
}
for (int i = 0; i < a.length; i++) {
sort(prefix + a[i], copy(a, i));
}
}
private static int[] copy(int[] a,int index){
int[] b = new int[a.length-1];
System.arraycopy(a, 0, b, 0, index);
System.arraycopy(a, index+1, b, index, a.length-index-1);
return b;
}
**********************************************************************
基本思路:
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];
private int[][] a = new int[n][n];
private String result = "";
private TreeSet set = new TreeSet();
public static void main(String[] args) {
new TestQuestion().start();
}
private void start() {
// Initial the map a[][]
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;
}
}
}
// 3 and 5 can not be the neighbor.
a[3][5] = 0;
a[5][3] = 0;
// Begin to depth search.
for (int i = 0; i < n; i++) {
this.depthFirstSearch(i);
}
// Print result treeset.
Iterator it = set.iterator();
while (it.hasNext()) {
String string = (String) it.next();
// "4" can not be the third position.
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) {
// Filt the duplicate value.
set.add(result);
}
for(int j = 0; j < n; j++) {
if (a[startIndex][j] == 1 && visited[j] == false) {
depthFirstSearch(j);
} else {
continue;
}
}
// restore the result value and visited value after listing a node.
result = result.substring(0, result.length() -1);
visited[startIndex] = false;
}
}
分享到:
相关推荐
通过java实现这些算法,可以加强程序员在算法面试或比赛中对图论算法的理解和应用能力。 二、宽度优先搜索(BFS)和深度优先搜索(DFS)的应用实例 1. n-皇后问题 n-皇后问题是一个经典的回溯算法问题。在这个...
首先,让我们详细探讨一下Java算法的重要性。算法是解决问题的步骤或方法,是计算机科学的基础。在Java编程中,良好的算法设计和实现能力能够极大地提高代码的效率和可读性。通过解决这些算法题,开发者可以锻炼逻辑...
首先,让我们来看看Java算法中的基础部分——排序算法。Java中常见的排序算法有冒泡排序、插入排序、选择排序、快速排序、归并排序和堆排序等。冒泡排序和插入排序适用于小规模数据,而快速排序和归并排序则在大数据...
在编程领域,算法是解决问题的关键,对于Java开发者来说,熟悉并掌握各种经典算法至关重要。"JAVA经典算法90题【含源码】-史上最全"这个压缩包文件提供了一个宝贵的资源,涵盖了90个Java实现的经典算法问题,旨在...
在编程领域,特别是Java开发,熟练掌握算法是提升技术能力的关键。"JAVA经典算法90题【含源码】"的资源集合为Java初学者提供了...所以,对于初学者来说,这套资料是提高Java算法能力的宝贵资源,应充分利用并深入研究。
6. **图论算法**:包括Dijkstra最短路径算法、Floyd-Warshall所有对最短路径算法、拓扑排序和Kruskal最小生成树算法。这些算法在Java中可以通过邻接矩阵或邻接表来实现。 7. **数据结构**:算法的高效实现离不开...
Java作为一门广泛应用于企业级开发和互联网应用的语言,其经典算法是每个Java程序员必备的技能之一。本资源包“Java经典算法(包你们划算)”提供了丰富的学习材料,旨在帮助开发者提升算法理解和应用能力。主要包含...
在准备Java程序员的面试过程中,算法和数据结构是不可...对于那些想要在Java算法面试中脱颖而出的求职者,这是一个非常宝贵的资源。通过系统学习和反复练习,可以显著提升面试成功率,为你的职业生涯打开更广阔的道路。
旅行商问题(Traveling Salesman Problem,TSP)是一个经典的组合优化问题,它涉及寻找最短的可能路线,使得旅行商能够访问每个城市一次并返回起点。这个问题在计算机科学、运筹学和图论中都有广泛的研究,因为它...
"JAVA经典算法收集整理 以及Java算法大全(近100种算法打包)" 是一个宝贵的资源库,涵盖了各种基础到高级的算法,对于学习和提升Java编程能力具有极大的价值。 这个压缩包中的文件列表可能包括了各种算法的实现...
经典算法是计算机科学的基础,包括排序、搜索、图论、动态规划等多个方面。这些算法不仅有助于提升代码的效率,也是面试和工作中常见问题的解决方案。在描述中提到的资源,很可能是通过`index.html`这个网页文件提供...
6. 树结构:二叉树的遍历(前序、中序、后序遍历)、平衡二叉树(AVL树、红黑树)、二叉搜索树以及树的查找、插入和删除操作都是Java算法中的重点。 7. 数据结构:链表、栈、队列、哈希表、堆等基本数据结构的实现...
其次,`java经典算法40题`可能是包括排序(如冒泡排序、快速排序、归并排序等)、搜索(如线性搜索、二分搜索等)、图论、动态规划等算法题目。掌握这些经典算法对于提高代码效率和解决问题的能力至关重要。在面试中...
Java经典算法是编程领域中的重要组成部分,对于提升编程能力、解决复杂问题以及优化代码效率具有至关重要的作用。这些算法不仅适用于Java语言,许多原理在其他编程语言中也通用。本资源包包含了一系列PPT,旨在帮助...
在编程中,有许多开源库支持图论算法,如C++的`Boost.Graph`库,Python的`NetworkX`,Java的`JUNG`等,这些库提供了丰富的接口和实现,简化了开发者在实际项目中应用图论算法的难度。 综上所述,“图论算法软件....
"100个Java经典算法"这个资源包含了各种各样的编程挑战,旨在帮助Java初学者和高手提升技能,巩固基础,同时也提供了复习和实践的机会。 在这个资源中,你可以期待学习到以下几类重要的算法: 1. **排序算法**:...
1. **Java常用算法**:Java算法是解决问题的核心工具,包括排序(如冒泡排序、快速排序、归并排序等)、搜索(如线性搜索、二分搜索等)、图算法(如深度优先搜索、广度优先搜索)、动态规划、贪心算法、回溯法等。...
在编程领域,算法是解决问题的关键,对于JAVA开发者来说,掌握经典算法不仅能提升编程能力,还能在面试和实际工作中表现出色。"JAVA经典算法40题"这个压缩包提供了一个学习和实践的机会,它包含了40个Java编程中的...
"经典算法大全"可能包含了排序算法(如归并排序、希尔排序)、查找算法(如二分查找、斐波那契查找)、图论算法(如最短路径算法Dijkstra、Floyd-Warshall)、动态规划(如背包问题、最长公共子序列)以及其他高级...
Java经典算法90题是一个集合,旨在通过一系列精心设计的编程题目来提升Java开发者在算法和编程技术上的技能。这些题目覆盖了从基础到高级的各种算法,有助于系统性地锻炼和提升思考问题以及编码实现的能力。 算法是...