package a.test;
import java.util.HashSet;
import java.util.Set;
public class Perm {
/**
* 题目:用1、2、2、3、4、5这六个数字,用java写一个main函数,打印出所有不同的排列,如:512234、412325等.
* 要求:"4"不能在第三位,"3"与"5"不能相连
* A(6,6)-A(5,5)-2*5*A(4,4)+2*3*A(3,3)=396,396/2=198
* two solutions:
* 1.Permutation
* 2.Graph,depthFirst
*/
public static final int BAD_INDEX = 3;
public static final int BAD_VALUE = 4;
public static final int FIRST_VALUE = 3;
public static final int SECOND_VALUE = 5;
/*use 'Set' to reject duplicate string.Maybe we should do this at the very beginning(create the string),but how?
I google it,and I find this:
1.let data = { 1, 2, 6, 3, 4, 5 };
2.get all the permutation of 'data',but only store the strings which match "str.matches("^.*6.*2.*$")" (or str.matches("^.*2.*6.*$"))
3.str.replace('6','2')
*/
private Set<String> resultSet=new HashSet<String>();
public static void main(String[] args) {
Perm p = new Perm();
int[] data = { 1, 2, 2, 3, 4, 5 };
p.perm(data, 0, data.length - 1);
Set<String> set=p.getResultSet();
for(String str :set){
System.out.println(str);
}
System.out.println(set.size());
}
//find all possible combination
public void perm(int[] data, int begin, int end) {
if (data == null || data.length == 0) {
return;
}
if (begin == end) {
boolean ok = check(data);//exclude the 'bad' string
if (ok) {
String str=stringOf(data);
resultSet.add(str);
}
}
for (int i = begin; i <= end; i++) {
swap(data, begin, i);
perm(data, begin + 1, end);
swap(data, begin, i);
}
}
//exclude the 'bad' string--"4"不能在第三位,"3"与"5"不能相连
//we can also use regular expression:(!str.matches("^..4.*$")&&!str.matches("^.*((35)|(53)).*$")&&str.matches("^.*2.*6.*$"))
public boolean check(int[] data) {
if (data == null || data.length == 0) {
return false;
}
for (int i = 0, len = data.length; i < len - 1; i++) {
if (data[i] == FIRST_VALUE && data[i + 1] == SECOND_VALUE
|| data[i + 1] == FIRST_VALUE && data[i] == SECOND_VALUE) {
return false;
}
if (i + 1 == BAD_INDEX && data[i] == BAD_VALUE) {
return false;
}
}
return true;
}
//int[] data = { 1, 2, 2, 3, 4, 5 }-->"122345"
public String stringOf(int[] x){
StringBuilder sb=new StringBuilder();
for(int i=0,len=x.length;i<len;i++){
sb.append(x[i]);
}
return sb.toString();
}
public void swap(int[] x, int i, int j) {
int tmp = x[i];
x[i] = x[j];
x[j] = tmp;
}
public Set<String> getResultSet(){
return resultSet;
}
}
package a.test;
import java.util.HashSet;
import java.util.Set;
public class Graph {
/**
* 题目:用1、2、2、3、4、5这六个数字,用java写一个main函数,打印出所有不同的排列,如:512234、412325等.
* 要求:"4"不能在第三位,"3"与"5"不能相连
* A(6,6)-A(5,5)-2*5*A(4,4)+2*3*A(3,3)=396,396/2=198
* two solutions:
* 1.Permutation
* 2.Graph,depthFirst
*/
private static final int[] DATA={1,2,2,3,4,5};
private static final int LENGTH=DATA.length;
private boolean[] visited;
private int[][] matrix;
private StringBuilder resultString;
private Set<String> resultSet;//use 'Set' to reject duplicate string.
public static void main(String[] args) {
Graph graph=new Graph();
graph.initial();
for(int i=0;i<LENGTH;i++){
graph.depthFirst(i);//start from 1,2,2,3,4,5,find their corresponding DFS
}
graph.print();
}
public void initial(){
resultString=new StringBuilder();
resultSet=new HashSet<String>();
int n=LENGTH;
visited=new boolean[n];
matrix=new int[n][n];
for(int i=0;i<n;i++){
for(int j=0;j<n;j++){
if(i==j){
matrix[i][j]=0;
}else{
matrix[i][j]=1;
}
}
}
//"3"与"5"不能相连
matrix[3][5]=0;
matrix[5][3]=0;
}
public void depthFirst(int origin){
//case 1.resultString includes DATA[origin]
resultString.append(DATA[origin]);
visited[origin]=true;
if(resultString.length()==LENGTH){
boolean ok=resultString.charAt(2)!='4';//"4"不能在第三位
if(ok){
resultSet.add(resultString.toString());
}
}
for(int i=0;i<LENGTH;i++){
if(!visited[i]&&matrix[origin][i]==1){
depthFirst(i);
}else{
continue;
}
}
//case 2.resultString don't include DATA[origin]
resultString.deleteCharAt(resultString.length()-1);//remove DATA[origin]
visited[origin]=false;
}
public void print(){
for(String str:resultSet){
System.out.println(str);
}
System.out.println(resultSet.size());
}
}
分享到:
相关推荐
然而,如果你需要在Android Studio中测试独立的Java类,比如包含`main()`函数的类,这里提供了一种方法。 首先,确保你已经创建了一个包含`main()`函数的Java类。如上面的示例所示,有两个类`HanTest`和`HanTest2`...
在这个main方法中,程序通过两种方式创建了两个线程:一个打印1到1000之间的所有奇数,另一个打印所有偶数。通过使用while循环,程序会持续运行直到两个线程都完成了它们的任务。 总结来说,Java通过两种方式提供了...
在 Java 中,`Runnable` 接口是用于实现多线程的一种方式,它只定义了一个 `run()` 方法,当创建一个实现了 `Runnable` 接口的类时,就需要重写这个方法来定义线程的具体行为。 **1.2 ThreadMock 类的 start 方法**...
下面是一个使用非递归的方法来打印 Fibonacci 数列的 Java 代码: ```java public class Test2 { public static void main(String[] args) { // 打印出结果,需要调用 method(int n) 方法。n 即为 Fibonacci 数列...
在这个游戏中,玩家需要从一个初始数字开始,每次可以加3或者减2,目标是通过这样的操作使数字变为0。在Java编程中,实现这个逻辑可以帮助初学者更好地理解条件判断和循环结构。下面我们将详细介绍两种不同的Java...
本文将详细介绍两种常见的生成随机数的方法:利用`Math.random()`函数以及使用`java.util.Random`类。 #### 方法一:使用`Math.random()` `Math.random()`函数可以用来生成一个介于0(包括)与1(不包括)之间的双...
它是继SHA-1和SHA-2之后的新一代加密哈希算法,旨在提高安全性并解决前两代算法可能存在的潜在弱点。SHA-3基于Keccak算法,由Guido Bertoni、Joan Daemen、Stefan Van Assche和Gilles Van Assche设计。Keccak算法以...
)是5 × 4 × 3 × 2 × 1 = 120。递归方法计算阶乘的基本思路是:n! = n × (n - 1)!,当n为1时,1! = 1,这是递归的基础情况。 在Java中,我们可以创建一个名为`factorial`的方法,该方法接受一个整数n作为参数...
本篇笔记主要探讨了如何在Java中实现控制台输入各种类型的数据,并提供了两种检查字符串中是否包含数字的方法。 首先,Java通过`System.in`流提供对控制台输入的访问。我们可以使用`Scanner`类来读取用户输入。以下...
例如,一个简单的加法函数定义如下: ```c int add(int a, int b) { return a + b; } ``` 这里`int`是返回类型,`add`是函数名,`(int a, int b)`是参数列表。函数声明用于告诉编译器函数的存在,通常在函数使用前...
1. 如果父类有一个无参数的构造函数,那么子类在创建对象时,会默认调用这个无参数的父类构造函数。这是因为在子类的构造函数执行之前,总会先执行父类的构造函数,以确保父类的状态被正确初始化。 2. 如果父类没有...
这段Java代码首先创建了一个`PythonInterpreter`实例,然后使用`execfile`方法加载了`addition.py`文件。接着,通过`get`方法获取了Python的`add`函数,并使用`__call__`方法调用该函数,传入两个`PyInteger`对象...
Java打印可对齐的任意层数的杨辉三角形是一个典型的编程问题,它涉及到递归、数组和控制流等基础知识。杨辉三角形,又称帕斯卡三角形,是数学中一个有趣的图形,每一行的数字是上一行相邻两个数字之和。在编程中,...
1. **创建Java库**:在Java端,你需要编写一个包含你要被调用函数的Java类,并编译成一个`.class`文件,然后通过Java的`javah`工具生成C/C++的头文件,这个头文件描述了Java函数的C语言接口。 2. **JNI接口**:在...
4. 将两个 Word 文档的内容合并到新的 Word 文档中,使用 appendBody 方法将第二个文档的内容追加到第一个文档中。 5. 保存新的 Word 文档,使用 FileOutputStream 保存文档。 在上面的代码中,我们可以看到,main ...
这个数列的每一个数字是前两个数字的和,通常以0和1作为起始项。数列的前几项是0, 1, 1, 2, 3, 5, 8, 13, 21, 34, ...。Fibonacci数列在计算机科学中有着广泛的应用,比如算法设计、数据分析、图形学等。 在Java中...
以下是一个使用递归实现阶乘的Java函数: ```java public static int factorial(int n) { if (n == 1) { return 1; } else { return n * factorial(n - 1); } } ``` 在上述代码中,`factorial`函数会一直调用...
这种方式是最直接的,方便的,不需要加什么插件jar包,只要前台在一个div中模仿着报表的格式去设置界面布局,然后把数据动态的填充进去,再调用JavaScript打印函数,就可以实现界面的局部打印功能。如果不想让报表...
**函数式接口**(Functional Interface)是指一个接口只含有一个抽象方法,这种接口可以使用`@FunctionalInterface`注解来标记,从而确保该接口确实只包含一个抽象方法。 ##### **1. CurrentTimePrinter** **定义*...