`

两种方法-用1、2、2、3、4、5这六个数字,用java写一个main函数,打印出所有不同的排列,如:512234、412325等.要求:"4"不能在第三位

 
阅读更多
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());
	}
}

2
0
分享到:
评论

相关推荐

    Android studio 运行main 函数的方法

    然而,如果你需要在Android Studio中测试独立的Java类,比如包含`main()`函数的类,这里提供了一种方法。 首先,确保你已经创建了一个包含`main()`函数的Java类。如上面的示例所示,有两个类`HanTest`和`HanTest2`...

    java用线程两种方式

    在这个main方法中,程序通过两种方式创建了两个线程:一个打印1到1000之间的所有奇数,另一个打印所有偶数。通过使用while循环,程序会持续运行直到两个线程都完成了它们的任务。 总结来说,Java通过两种方式提供了...

    多线程 打印1-99,100-199

    在 Java 中,`Runnable` 接口是用于实现多线程的一种方式,它只定义了一个 `run()` 方法,当创建一个实现了 `Runnable` 接口的类时,就需要重写这个方法来定义线程的具体行为。 **1.2 ThreadMock 类的 start 方法**...

    java用非递归的方法打印Fibonacci数列

    下面是一个使用非递归的方法来打印 Fibonacci 数列的 Java 代码: ```java public class Test2 { public static void main(String[] args) { // 打印出结果,需要调用 method(int n) 方法。n 即为 Fibonacci 数列...

    用java实现数三退一 两种方法

    在这个游戏中,玩家需要从一个初始数字开始,每次可以加3或者减2,目标是通过这样的操作使数字变为0。在Java编程中,实现这个逻辑可以帮助初学者更好地理解条件判断和循环结构。下面我们将详细介绍两种不同的Java...

    java中随机函数的实现

    本文将详细介绍两种常见的生成随机数的方法:利用`Math.random()`函数以及使用`java.util.Random`类。 #### 方法一:使用`Math.random()` `Math.random()`函数可以用来生成一个介于0(包括)与1(不包括)之间的双...

    Keccak和SHA-3哈希函数的Java实现。.zip

    它是继SHA-1和SHA-2之后的新一代加密哈希算法,旨在提高安全性并解决前两代算法可能存在的潜在弱点。SHA-3基于Keccak算法,由Guido Bertoni、Joan Daemen、Stefan Van Assche和Gilles Van Assche设计。Keccak算法以...

    java递归实现 阶乘

    )是5 × 4 × 3 × 2 × 1 = 120。递归方法计算阶乘的基本思路是:n! = n × (n - 1)!,当n为1时,1! = 1,这是递归的基础情况。 在Java中,我们可以创建一个名为`factorial`的方法,该方法接受一个整数n作为参数...

    java代码笔记2010-06-12:java控制台输入各类型类实现;以及判断输入字符串里面是否有数字的两种方法:方法1:转换成字符数组;方法2:正则表达式。

    本篇笔记主要探讨了如何在Java中实现控制台输入各种类型的数据,并提供了两种检查字符串中是否包含数字的方法。 首先,Java通过`System.in`流提供对控制台输入的访问。我们可以使用`Scanner`类来读取用户输入。以下...

    java函数语言大全

    例如,一个简单的加法函数定义如下: ```c int add(int a, int b) { return a + b; } ``` 这里`int`是返回类型,`add`是函数名,`(int a, int b)`是参数列表。函数声明用于告诉编译器函数的存在,通常在函数使用前...

    Java继承时构造函数的调用

    1. 如果父类有一个无参数的构造函数,那么子类在创建对象时,会默认调用这个无参数的父类构造函数。这是因为在子类的构造函数执行之前,总会先执行父类的构造函数,以确保父类的状态被正确初始化。 2. 如果父类没有...

    java调用python中的自定义函数函数

    这段Java代码首先创建了一个`PythonInterpreter`实例,然后使用`execfile`方法加载了`addition.py`文件。接着,通过`get`方法获取了Python的`add`函数,并使用`__call__`方法调用该函数,传入两个`PyInteger`对象...

    java打印可对齐的任意层数的杨辉三角形

    Java打印可对齐的任意层数的杨辉三角形是一个典型的编程问题,它涉及到递归、数组和控制流等基础知识。杨辉三角形,又称帕斯卡三角形,是数学中一个有趣的图形,每一行的数字是上一行相邻两个数字之和。在编程中,...

    delphi调用Java函数

    1. **创建Java库**:在Java端,你需要编写一个包含你要被调用函数的Java类,并编译成一个`.class`文件,然后通过Java的`javah`工具生成C/C++的头文件,这个头文件描述了Java函数的C语言接口。 2. **JNI接口**:在...

    java 使用POI合并两个word文档.docx

    4. 将两个 Word 文档的内容合并到新的 Word 文档中,使用 appendBody 方法将第二个文档的内容追加到第一个文档中。 5. 保存新的 Word 文档,使用 FileOutputStream 保存文档。 在上面的代码中,我们可以看到,main ...

    兰州大学马俊java实验1

    这个数列的每一个数字是前两个数字的和,通常以0和1作为起始项。数列的前几项是0, 1, 1, 2, 3, 5, 8, 13, 21, 34, ...。Fibonacci数列在计算机科学中有着广泛的应用,比如算法设计、数据分析、图形学等。 在Java中...

    【IT十八掌徐培成】Java基础第03天-02.函数定义-调用-sum-fac-递归.zip

    以下是一个使用递归实现阶乘的Java函数: ```java public static int factorial(int n) { if (n == 1) { return 1; } else { return n * factorial(n - 1); } } ``` 在上述代码中,`factorial`函数会一直调用...

    JAVA的Web打印方式(PageOffice、POI、jacob,html打印等)

    这种方式是最直接的,方便的,不需要加什么插件jar包,只要前台在一个div中模仿着报表的格式去设置界面布局,然后把数据动态的填充进去,再调用JavaScript打印函数,就可以实现界面的局部打印功能。如果不想让报表...

    day12_函数式接口、方法引用_每日作业卷1

    **函数式接口**(Functional Interface)是指一个接口只含有一个抽象方法,这种接口可以使用`@FunctionalInterface`注解来标记,从而确保该接口确实只包含一个抽象方法。 ##### **1. CurrentTimePrinter** **定义*...

Global site tag (gtag.js) - Google Analytics