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; } } } } }
相关推荐
用1、2、2、3、4、5这六个数字,用java写一个main函数,打印出所有不同的排列,如:512234、412345等,要求: "4 "不能在第三位, "3 "与 "5 "不能相连.
3. 修改实验1第2题的程序,添加适当代码,以确保每个数字都恰好只被打印一次。 实验步骤: (1)、创建三个类Counter, Printer,Storage (2)、 创建TestCounter类,在该类中定义main函数,在main函数中定义Storage...
)是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程序,用于输出顺时针旋转的数字方阵。这个方阵的特性是从中心开始,数字按照顺时针方向填充。给定的代码片段是用C++编写的,但我们可以将其转换为Java语言,并解释其工作原理。 ...
- **主方法**:`public static void main(String[] args)` 是Java程序的入口点,所有Java应用程序都必须包含这样一个方法。 - **成员方法**:`static void cfb()` 是类`ChengFaBiao`的一个静态方法,用于生成乘法表...
在编程领域,回文数是一个十分有趣的主题,它是指一个正读反读都能得到相同结果的数字,例如121、12321等。本篇将详细讲解如何使用Java编程语言来实现求解1到1万之间所有回文数的算法。 首先,我们需要理解如何判断...
在这个任务中,我们将探讨如何使用Java来打印出100以内的所有质数。 首先,我们需要了解找到质数的基本算法。一种常见的方法是“埃拉托斯特尼筛法”(Sieve of Eratosthenes),但在这里,由于范围较小(1到100),...
本文将通过一个简单的示例程序来介绍如何使用Java生成随机的字母。 #### 二、基础知识 在开始之前,我们需要了解以下几个基础概念: - **`java.util.Random`类**:Java中的`Random`类提供了一种方式来生成伪随机数...
在本实践课程“Java2上机实践1初识java”中,我们将深入探索Java编程的基础概念,通过一系列有趣的实例来加深理解。这个压缩包包含了实验1的相关材料,旨在引导我们逐步掌握Java语言的核心特性。 首先,我们要从"猜...
Java打印可对齐的任意层数的杨辉三角形是一个典型的编程问题,它涉及到递归、数组和控制流等基础知识。杨辉三角形,又称帕斯卡三角形,是数学中一个有趣的图形,每一行的数字是上一行相邻两个数字之和。在编程中,...
在这个main方法中,程序通过两种方式创建了两个线程:一个打印1到1000之间的所有奇数,另一个打印所有偶数。通过使用while循环,程序会持续运行直到两个线程都完成了它们的任务。 总结来说,Java通过两种方式提供了...
这个数列的每一个数字是前两个数字的和,通常以0和1作为起始项。数列的前几项是0, 1, 1, 2, 3, 5, 8, 13, 21, 34, ...。Fibonacci数列在计算机科学中有着广泛的应用,比如算法设计、数据分析、图形学等。 在Java中...
根据实验需求,我们需要创建两个子线程,分别打印从 1 到 99 和从 100 到 199 的数字,并且这两个线程需要交替打印数字。 **3.1 创建打印线程** 首先,我们创建两个类 `Test1` 和 `Test2` 来代表两个子线程,它们...
`main`方法展示了如何创建一个`Lottery`实例并打印出随机生成的号码。 这个项目可以帮助初学者理解Java类的创建、对象的实例化、随机数生成以及集合类的使用。对于更高级的开发者,还可以扩展这个项目,例如添加...
本教程将详细介绍如何使用Java编写一个简单的计算器,实现基本的加、减、乘、除功能,这对于初学者来说是一个很好的学习项目。 首先,我们需要了解Java的基础语法和面向对象编程的概念。在Java中,每个程序都是由一...
根据给定文件的信息,我们可以详细地探讨如何使用Java来实现Fibonacci数列,并通过具体的代码示例来深入了解这一主题。 ### Java实现Fibonacci数列 #### 1. Fibonacci数列简介 Fibonacci数列是一系列数字,其中每...
Java打印100以内的素数是一个常见的编程练习,它涉及到基础的算法设计和Java编程技巧。素数是大于1的自然数,除了1和它自身外,不能被其他自然数整除的数。在Java中,我们可以通过一系列步骤来实现这个功能。 首先...
在main方法中,我们使用了一个循环来生成50个32位随机字符串,然后将生成的随机字符串打印出来。 四、优点和缺点 使用Random函数生成随机数的优点是非常简单方便,代码量少,效率高。但是,使用Random函数生成...
### 文曲星游戏-猜数字JAVA代码解析 #### 背景介绍 “猜数字”是一种经典的思维训练游戏,尤其在学生群体中非常流行。玩家需要根据系统随机生成的一个四位数(每位数字不重复),通过猜测尝试找出这个数字。每猜一...