题目如下:用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;
}
}
- 浏览: 28018 次
- 性别:
- 来自: 北京
相关推荐
- 对于没有算法背景的开发者来说,理解和实现DFA可能会有一定难度。 ### 五、总结 通过DFA算法,我们可以创建一个高效的敏感词过滤系统。虽然它需要一定的编程和算法知识,但其优势在于可以快速准确地处理大量文本...
在Java编程中,良好的算法设计和实现能力能够极大地提高代码的效率和可读性。通过解决这些算法题,开发者可以锻炼逻辑思维,理解和掌握数据结构,如数组、链表、栈、队列、树、图等,以及排序、搜索、图论、动态规划...
在这个“java常见算法题解析大全”中,你将找到一系列涵盖不同难度级别的算法问题,旨在帮助Java开发者提升技能,增强解决问题的能力。 首先,让我们了解一下折半查找(Binary Search)算法。这是一种在有序数组中...
### 图解算法小册-Java版 #### 一、引言 随着计算机科学的发展,算法作为其中不可或缺的一部分,越来越受到人们的重视。《图解算法小册-Java版》旨在通过直观的方式,帮助读者理解并掌握各种算法的核心思想,无论你...
Java经典算法90题是一个集合,旨在通过一系列精心设计的编程题目来提升Java开发者在算法和编程技术上的技能。这些题目覆盖了从基础到高级的各种算法,有助于系统性地锻炼和提升思考问题以及编码实现的能力。 算法是...
《Java算法设计与题解》是一本专注于Java编程语言中的算法设计和问题解决的书籍,旨在帮助读者深入理解和掌握各种经典算法,并通过编程实例来提升实际应用能力。书中的内容涵盖了算法的基础理论、核心思想以及在Java...
本项目中,我们重点探讨的是“Java连连看”的经典算法,包括随机分布算法、遍历查找算法以及时间进度控制算法。这些算法的设计不仅保证了游戏的趣味性和挑战性,还使得代码实现更加简洁易懂。 首先,随机分布算法是...
这个训练集包含了各种难度的题目,旨在帮助开发者提升在实际编程中运用算法的能力。下面我们将深入探讨其中可能涵盖的知识点。 1. **基础语法**: - 变量与数据类型:Java支持基本数据类型(如int、double、...
根据给定的文件信息,我们可以总结出以下几个Java算法的经典题目及其相关知识点: ### 1. 输出九九乘法表 这段代码实现了一个简单的九九乘法表的输出功能。通过两个嵌套的for循环,实现了从1×1到9×9的所有乘法...
在实际开发中,由于RSA算法涉及到非常大的数字运算,因此通常使用Java中的`BigInteger`类来进行处理。下面将介绍实现RSA算法的关键模块。 1. **密钥对的生成** ```java public void generateKeys(String bit...
这个项目是使用JAVA编程语言实现的数独游戏,不仅提供了游戏界面,还包含了一套生成唯一解和不同难度数独的算法。 首先,数独的生成算法通常基于挖洞(Backtracking)思想。这种算法的核心是递归地填充空格,每次...
Java公钥加密算法RSA是一种广泛应用于网络通信中的安全技术,主要基于数学问题的难度来确保数据的安全性。RSA,由其发明者Ron Rivest、Adi Shamir和Leonard Adleman的名字首字母组成,是一种非对称加密算法,这意味...
在本项目中,“基于Java与粒子群优化算法PSO的自动组卷考试系统设计与实现”是一个创新的教育技术应用,旨在提高教师的工作效率并确保考试的公平性。该系统结合了计算机科学与优化算法,为教育领域带来智能化的解决...
总的来说,Java数独题库高效生成算法是一种结合了数学、逻辑和编程技巧的解决方案,它能够生成各种难度级别的数独谜题,并且在性能上进行了优化,适合大规模的数独题库生成需求。通过学习和理解这样的算法,不仅可以...
2. **查找算法**:如二分查找、哈希查找等,这些方法能高效地在数据结构中寻找特定元素,对大数据量的处理尤为重要。 3. **图算法**:如深度优先搜索(DFS)和广度优先搜索(BFS),这些算法在解决网络问题、社交网络...
RSA由Rivest、Shamir和Adleman提出,它的安全性基于大整数因子分解的难度。 **5. 数字签名** 数字签名利用非对称加密中的私钥对信息的特征数据进行签名,提供不可否认性和数据完整性。它结合了散列函数(如SHA-1)...
题库提供了丰富的算法题目,如LeetCode、HackerRank等在线平台,这些平台的题目涵盖了各种难度,可以帮助你逐步提升算法设计和实现能力。 在实际解题过程中,不仅要关注正确性,还要注意代码的效率和可读性,这涉及...
IDEA采用了128位的密钥,这极大地提高了其安全性,使得破解的难度远高于DES。 在Java环境中实现IDEA加密有多个关键步骤和知识点: 1. **JCA(Java Cryptography Architecture)和JCE(Java Cryptography Extension...
RSA是一种非对称加密算法,基于大素数分解的难度。它有公钥和私钥,公钥用于加密,私钥用于解密,常用于数字签名和密钥交换。 7. 数字签名: 数字签名利用非对称加密技术,提供数据完整性和发送者身份验证。它...
这40个算法实例涵盖了基础到进阶的不同难度,为学习者提供了丰富的实践机会。 首先,我们来探讨一下算法的基础概念。算法是一系列明确的指令,用于解决特定问题或执行特定任务。在计算机科学中,良好的算法设计可以...