`
书音棋
  • 浏览: 145487 次
  • 性别: Icon_minigender_1
  • 来自: 哈尔滨
社区版块
存档分类
最新评论

Java经典算法集--图论

    博客分类:
  • java
 
阅读更多

算法程序题:

    该公司笔试题就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实现)

    通过java实现这些算法,可以加强程序员在算法面试或比赛中对图论算法的理解和应用能力。 二、宽度优先搜索(BFS)和深度优先搜索(DFS)的应用实例 1. n-皇后问题 n-皇后问题是一个经典的回溯算法问题。在这个...

    java经典算法90题含源码及答案.rar

    首先,让我们详细探讨一下Java算法的重要性。算法是解决问题的步骤或方法,是计算机科学的基础。在Java编程中,良好的算法设计和实现能力能够极大地提高代码的效率和可读性。通过解决这些算法题,开发者可以锻炼逻辑...

    java经典算法题

    首先,让我们来看看Java算法中的基础部分——排序算法。Java中常见的排序算法有冒泡排序、插入排序、选择排序、快速排序、归并排序和堆排序等。冒泡排序和插入排序适用于小规模数据,而快速排序和归并排序则在大数据...

    JAVA经典算法90题【含源码】-史上最全

    在编程领域,算法是解决问题的关键,对于Java开发者来说,熟悉并掌握各种经典算法至关重要。"JAVA经典算法90题【含源码】-史上最全"这个压缩包文件提供了一个宝贵的资源,涵盖了90个Java实现的经典算法问题,旨在...

    JAVA经典算法90题【含源码】

    在编程领域,特别是Java开发,熟练掌握算法是提升技术能力的关键。"JAVA经典算法90题【含源码】"的资源集合为Java初学者提供了...所以,对于初学者来说,这套资料是提高Java算法能力的宝贵资源,应充分利用并深入研究。

    算法导论-java

    6. **图论算法**:包括Dijkstra最短路径算法、Floyd-Warshall所有对最短路径算法、拓扑排序和Kruskal最小生成树算法。这些算法在Java中可以通过邻接矩阵或邻接表来实现。 7. **数据结构**:算法的高效实现离不开...

    Java经典算法(包你们划算)

    Java作为一门广泛应用于企业级开发和互联网应用的语言,其经典算法是每个Java程序员必备的技能之一。本资源包“Java经典算法(包你们划算)”提供了丰富的学习材料,旨在帮助开发者提升算法理解和应用能力。主要包含...

    算法面试专题课(Java版),Google面试官带你高质量刷题视频教程

    在准备Java程序员的面试过程中,算法和数据结构是不可...对于那些想要在Java算法面试中脱颖而出的求职者,这是一个非常宝贵的资源。通过系统学习和反复练习,可以显著提升面试成功率,为你的职业生涯打开更广阔的道路。

    旅行商问题-遗传算法--java

    旅行商问题(Traveling Salesman Problem,TSP)是一个经典的组合优化问题,它涉及寻找最短的可能路线,使得旅行商能够访问每个城市一次并返回起点。这个问题在计算机科学、运筹学和图论中都有广泛的研究,因为它...

    JAVA经典算法收集整理 以及Java算法大全(近100种算法打包).rar

    "JAVA经典算法收集整理 以及Java算法大全(近100种算法打包)" 是一个宝贵的资源库,涵盖了各种基础到高级的算法,对于学习和提升Java编程能力具有极大的价值。 这个压缩包中的文件列表可能包括了各种算法的实现...

    C语言,java经典算法

    经典算法是计算机科学的基础,包括排序、搜索、图论、动态规划等多个方面。这些算法不仅有助于提升代码的效率,也是面试和工作中常见问题的解决方案。在描述中提到的资源,很可能是通过`index.html`这个网页文件提供...

    java经典算法案例

    6. 树结构:二叉树的遍历(前序、中序、后序遍历)、平衡二叉树(AVL树、红黑树)、二叉搜索树以及树的查找、插入和删除操作都是Java算法中的重点。 7. 数据结构:链表、栈、队列、哈希表、堆等基本数据结构的实现...

    java最新经典算法源码

    其次,`java经典算法40题`可能是包括排序(如冒泡排序、快速排序、归并排序等)、搜索(如线性搜索、二分搜索等)、图论、动态规划等算法题目。掌握这些经典算法对于提高代码效率和解决问题的能力至关重要。在面试中...

    java经典算法(PPT资源)

    Java经典算法是编程领域中的重要组成部分,对于提升编程能力、解决复杂问题以及优化代码效率具有至关重要的作用。这些算法不仅适用于Java语言,许多原理在其他编程语言中也通用。本资源包包含了一系列PPT,旨在帮助...

    图论算法软件.rar

    在编程中,有许多开源库支持图论算法,如C++的`Boost.Graph`库,Python的`NetworkX`,Java的`JUNG`等,这些库提供了丰富的接口和实现,简化了开发者在实际项目中应用图论算法的难度。 综上所述,“图论算法软件....

    100个java经典算法

    "100个Java经典算法"这个资源包含了各种各样的编程挑战,旨在帮助Java初学者和高手提升技能,巩固基础,同时也提供了复习和实践的机会。 在这个资源中,你可以期待学习到以下几类重要的算法: 1. **排序算法**:...

    eclipse-java-workspace.rar_java常用算法集工作间打包

    1. **Java常用算法**:Java算法是解决问题的核心工具,包括排序(如冒泡排序、快速排序、归并排序等)、搜索(如线性搜索、二分搜索等)、图算法(如深度优先搜索、广度优先搜索)、动态规划、贪心算法、回溯法等。...

    JAVA经典算法40题.zip

    在编程领域,算法是解决问题的关键,对于JAVA开发者来说,掌握经典算法不仅能提升编程能力,还能在面试和实际工作中表现出色。"JAVA经典算法40题"这个压缩包提供了一个学习和实践的机会,它包含了40个Java编程中的...

    java经典算法 适合初学者学习

    "经典算法大全"可能包含了排序算法(如归并排序、希尔排序)、查找算法(如二分查找、斐波那契查找)、图论算法(如最短路径算法Dijkstra、Floyd-Warshall)、动态规划(如背包问题、最长公共子序列)以及其他高级...

    java经典算法90 题目

    Java经典算法90题是一个集合,旨在通过一系列精心设计的编程题目来提升Java开发者在算法和编程技术上的技能。这些题目覆盖了从基础到高级的各种算法,有助于系统性地锻炼和提升思考问题以及编码实现的能力。 算法是...

Global site tag (gtag.js) - Google Analytics