`
bugyun
  • 浏览: 559164 次
社区版块
存档分类
最新评论

用1、2、2、3、4、5这六个数字,用java写一个main函数,打印出所有不同的排列

    博客分类:
  • Java
 
阅读更多
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashSet;
import java.util.LinkedList;
import java.util.List;
import java.util.Set;

/**
 * 项目名称:本示例作者站在方法复用、解构的角度来写的,按照数据整理,数据过滤,数据清洗的逻辑来做的,
 * 			如果仅仅是为了效率,可以把业务逻辑都放到 recursion 方法里
 * 类名称:RecursionDemo.java 
 * 类描述: 
 * 创建人:beyond 
 * 创建时间:2016年10月27日 下午10:17:27 
 * 修改人: 
 * 修改时间: 
 * 修改备注: 
 * @version
 */
public class RecursionDemo {
	 public static void main(String[] args) {  
	        List<Integer> data = new LinkedList<>();  
	        data.add(1);
	        data.add(2);  
	        data.add(2);  
	        data.add(3);
	        data.add(4);
	        data.add(5);
	          
//	  		 全排列
	        List<List<Integer>> result = recursion(data);  
//	  		去除2重复的数据
	        Set<List<Integer>> resultSet = new HashSet<>(result);
//	  		各集合参数都为List,方便复用
	        result = new ArrayList<>(resultSet);
//	       	剔除集合里“4”在第三位,“3”与“5”相连的元素
	        clean(result);
//	       	 结果为198
	        System.err.println(result.size());
	        
	 }  
	 
	 /**
	  * @description: 全排列
	  * 	1. 如果集合长度为 1 ,则将该集合放入List集合,否则走下面逻辑;
	  * 	2. 取集合第一个元素,剔除第一个元素后组装新的集合,递归;
	  * 	3. 新建List<List<>>集合,递归返回结果放入该集合;
	  * 	4. 取得递归记过二次循环遍历,与2中集合第一个元素重新拼接组装;
	  * 
	  * @param source
	  * @return   
	  * @return List<List<Integer>>   
	  * @throws
	  * @author beyond
	  * @data:2016年10月27日下午9:27:02
	  */
	 public  static List<List<Integer>> recursion(List<Integer> source){
		 
		 List<List<Integer>> target = new ArrayList<>();

		 if(source.size() == 1){
			 target.add(source);
		 }else{
			 Integer first = source.get(0);
			 List<Integer> otherList = source.subList(1, source.size());
			 
//			 递归直到otherList里含一个元素
			 List<List<Integer>> tmpList = recursion(otherList);
			 
			 for(List<Integer> tmp : tmpList){
				 for(int i=0 ; i<= tmp.size() ; i++){
					 List<Integer> innerList = new ArrayList<Integer>(tmp);
					 innerList.add(i,first);
					 target.add(innerList);
				 }
			 }
		 }
		 
		 return target;
	 }
	 
	 /**
	  * @description: 剔除集合里“4”在第三位,“3”与“5”相连的元素
	  * @param source   
	  * @return void   
	  * @throws
	  * @author beyond
	  * @data:2016年10月27日下午10:12:10
	  */
	 public  static void clean(List<List<Integer>> source){
		
		 for(int i=0 ; i<source.size() ; i++){
			 List<Integer> tmpList = source.get(i);
			 int size = tmpList.size();
			 if(size > 2){
				 if(tmpList.get(2).equals(4)){
					 source.remove(i);
					 i--;
					 continue;
				 }
			 }
			 
			 for(int j=size-1 ; j>0 ; j--){
				 if(tmpList.get(j).equals(3) && tmpList.get(j-1).equals(5)){
					 source.remove(i);
					 i--;
					 continue;
				 }else if(tmpList.get(j).equals(5) && tmpList.get(j-1).equals(3)){
					 source.remove(i);
					 i--;
					 continue;
				 }
			 }
		 }
		 
	 }
}

 

分享到:
评论

相关推荐

    一个关于java实现的迭代用法例子,太经典了

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

    JAVA多线程运用

    3. 修改实验1第2题的程序,添加适当代码,以确保每个数字都恰好只被打印一次。 实验步骤: (1)、创建三个类Counter, Printer,Storage (2)、 创建TestCounter类,在该类中定义main函数,在main函数中定义Storage...

    java递归实现 阶乘

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

    只用三行代码就从一千个数字随机选出了一百个不同的数字!

    这里我们将详细讲解如何实现这一功能,并分析给出的两个文件——Swap.java和RandomNum.java。 首先,让我们了解基本的随机数生成。在Java中,`java.util.Random`类是用于生成随机数的核心工具。我们可以创建一个`...

    数字旋转方阵(java)

    在本实验中,任务是创建一个Java程序,用于输出顺时针旋转的数字方阵。这个方阵的特性是从中心开始,数字按照顺时针方向填充。给定的代码片段是用C++编写的,但我们可以将其转换为Java语言,并解释其工作原理。 ...

    java编写一个乘法表

    - **主方法**:`public static void main(String[] args)` 是Java程序的入口点,所有Java应用程序都必须包含这样一个方法。 - **成员方法**:`static void cfb()` 是类`ChengFaBiao`的一个静态方法,用于生成乘法表...

    JAVA实现求1到1万之间所有回文数

    在编程领域,回文数是一个十分有趣的主题,它是指一个正读反读都能得到相同结果的数字,例如121、12321等。本篇将详细讲解如何使用Java编程语言来实现求解1到1万之间所有回文数的算法。 首先,我们需要理解如何判断...

    Java:打印出100以内的质数

    在这个任务中,我们将探讨如何使用Java来打印出100以内的所有质数。 首先,我们需要了解找到质数的基本算法。一种常见的方法是“埃拉托斯特尼筛法”(Sieve of Eratosthenes),但在这里,由于范围较小(1到100),...

    java随机生成数字和字母

    本文将通过一个简单的示例程序来介绍如何使用Java生成随机的字母。 #### 二、基础知识 在开始之前,我们需要了解以下几个基础概念: - **`java.util.Random`类**:Java中的`Random`类提供了一种方式来生成伪随机数...

    Java2上机实践1初识java

    在本实践课程“Java2上机实践1初识java”中,我们将深入探索Java编程的基础概念,通过一系列有趣的实例来加深理解。这个压缩包包含了实验1的相关材料,旨在引导我们逐步掌握Java语言的核心特性。 首先,我们要从"猜...

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

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

    java用线程两种方式

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

    兰州大学马俊java实验1

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

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

    根据实验需求,我们需要创建两个子线程,分别打印从 1 到 99 和从 100 到 199 的数字,并且这两个线程需要交替打印数字。 **3.1 创建打印线程** 首先,我们创建两个类 `Test1` 和 `Test2` 来代表两个子线程,它们...

    用java写的模拟彩票 随机选号

    `main`方法展示了如何创建一个`Lottery`实例并打印出随机生成的号码。 这个项目可以帮助初学者理解Java类的创建、对象的实例化、随机数生成以及集合类的使用。对于更高级的开发者,还可以扩展这个项目,例如添加...

    用Java编译一个计算器

    本教程将详细介绍如何使用Java编写一个简单的计算器,实现基本的加、减、乘、除功能,这对于初学者来说是一个很好的学习项目。 首先,我们需要了解Java的基础语法和面向对象编程的概念。在Java中,每个程序都是由一...

    java实现Fibonacci数列

    根据给定文件的信息,我们可以详细地探讨如何使用Java来实现Fibonacci数列,并通过具体的代码示例来深入了解这一主题。 ### Java实现Fibonacci数列 #### 1. Fibonacci数列简介 Fibonacci数列是一系列数字,其中每...

    java打印100以内的素数

    Java打印100以内的素数是一个常见的编程练习,它涉及到基础的算法设计和Java编程技巧。素数是大于1的自然数,除了1和它自身外,不能被其他自然数整除的数。在Java中,我们可以通过一系列步骤来实现这个功能。 首先...

    java开发技术调用rendom函数,随机生成32位不重复的字符

    在main方法中,我们使用了一个循环来生成50个32位随机字符串,然后将生成的随机字符串打印出来。 四、优点和缺点 使用Random函数生成随机数的优点是非常简单方便,代码量少,效率高。但是,使用Random函数生成...

    文曲星游戏-猜数字JAVA代码.

    ### 文曲星游戏-猜数字JAVA代码解析 #### 背景介绍 “猜数字”是一种经典的思维训练游戏,尤其在学生群体中非常流行。玩家需要根据系统随机生成的一个四位数(每位数字不重复),通过猜测尝试找出这个数字。每猜一...

Global site tag (gtag.js) - Google Analytics