我的Java开发学习之旅------>使用循环递归算法把数组里数据数组合全部列出
面试题如下:把一个数组里的数组合全部列出,比如1和2列出来为1,2,12,21。
(面试题出自《Java程序员面试宝典》)
代码如下:
import java.util.Arrays;
import java.util.LinkedList;
import java.util.List; /**
* 把一个数组里的数组集合全部列出,比如1和2列出来为1,2,12,21
*/
public class ListAll {
public static void main(String[] args) {
String[] array = new String[] { "1", "2", "3" };
listAll(Arrays.asList(array), "");
}
/**
* 使用递归方法
* @param candidate 递归遍历的List集合
* @param prefix 打印出的前缀
*/
public static void listAll(List<String> candidate, String prefix) {
System.out.println(prefix);
for (int i = 0; i < candidate.size(); i++) {
List temp = new LinkedList(candidate);// 转换为LinkedList便于安插和移动
listAll(temp, prefix + temp.remove(i));
}
}
}
输出结果为:
1
12
123
13
132
2
21
213
23
231
3
31
312
32
321
为了便于理解,在循环中加一句 System.out.println("candidate is: " + candidate);
public static void listAll(List<String> candidate, String prefix) {
System.out.println(prefix);
for (int i = 0; i < candidate.size(); i++) {
System.out.println("candidate is: " + candidate); // 此行代码便于理解递归
List temp = new LinkedList(candidate);// 转换为LinkedList便于安插和移动
listAll(temp, prefix + temp.remove(i));
}
}
这样输出结果为:
candidate is: [1, 2, 3]
1
candidate is: [2, 3]
12
candidate is: [3]
123
candidate is: [2, 3]
13
candidate is: [2]
132
candidate is: [1, 2, 3]
2
candidate is: [1, 3]
21
candidate is: [3]
213
candidate is: [1, 3]
23
candidate is: [1]
231
candidate is: [1, 2, 3]
3
candidate is: [1, 2]
31
candidate is: [2]
312
candidate is: [1, 2]
32
candidate is: [1]
321
算法其实就是现在有几个数,就先分成几组,例如[1,2,3]那么递归第一层就是1-[2,3],2-[1,3],3-[1,2]。然后把list传入继续递归以1-[2,3]为例:又分为2-[3], 3-[2],并且把这些与第一层的1拼接成为12-[3], 13-[2],然后list继续递归下去,这样就把1开头的组合都排列完了。2,3开头的都是同理了。
如果要打印出所有数的组合,如123,132,213,231,312,321
则将listAll方法代码改为下面
public static void listAll(List<String> candidate, String prefix) {
if (candidate.isEmpty()) {
System.out.println(prefix);
}
for (int i = 0; i < candidate.size(); i++) {
// System.out.println("candidate is: " + candidate); // 此行代码便于理解递归
List temp = new LinkedList(candidate);// 转换为LinkedList便于安插和移动
listAll(temp, prefix + temp.remove(i));
}
}
打印结果为:
123
132
213
231
312
321
去掉注释后,更加容易理解,打印结果为:
candidate is: [1, 2, 3]
candidate is: [2, 3]
candidate is: [3]
123
candidate is: [2, 3]
candidate is: [2]
132
candidate is: [1, 2, 3]
candidate is: [1, 3]
candidate is: [3]
213
candidate is: [1, 3]
candidate is: [1]
231
candidate is: [1, 2, 3]
candidate is: [1, 2]
candidate is: [2]
312
candidate is: [1, 2]
candidate is: [1]
321
==================================================================================================
作者:欧阳鹏 欢迎转载,与人分享是进步的源泉!
转载请保留原文地址:http://blog.csdn.net/ouyang_peng
==================================================================================================
我的Java开发学习之旅------>使用循环递归算法把数组里数据数组合全部列出的更多相关文章
- 我的Java开发学习之旅------>Java 格式化类(java.util.Formatter)基本用法
本文参考: http://docs.oracle.com/javase/1.5.0/docs/api/java/util/Formatter.html http://www.blogjava.net/ ...
- 我的Java开发学习之旅------>工具类:将播放器的进度值转换成相应的时间格式
在我的博客<我的Java开发学习之旅------>Java 格式化类(java.util.Formatter)基本用法,地址:http://blog.csdn.net/ouyang_pen ...
- 我的Java开发学习之旅------>工具类:Java获取字符串和文件进行MD5值
ps:这几天本人用百度云盘秒传了几部大片到云盘上,几个G的文件瞬秒竟然显示"上传成功"!这真让我目瞪口呆,要是这样的话,那得多快的网速,这绝对是不可能的,也许这仅是个假象.百度了一 ...
- 我的Java开发学习之旅------>工具类:Java使用正则表达式分离出字符串中的中文和英文
今天看到一个工具类使用正则表达式将一大段字符串中的中文和英文都分离出来了,在此记录一下,读者可以收藏! import java.util.ArrayList; import java.util.Col ...
- 我的Java开发学习之旅------>Base64的编码思想以及Java实现
Base64是一种用64个字符来表示随意二进制数据的方法. 用记事本打开exe.jpg.pdf这些文件时,我们都会看到一大堆乱码,由于二进制文件包括非常多无法显示和打印的字符.所以,假设要让记事本这种 ...
- 我的Java开发学习之旅------>Java利用Comparator接口对多个排序条件进行处理
一需求 二实现Comparator接口 三验证排序结果 验证第一条件首先按级别排序级别最高的排在前面 验证第二条如果级别相等那么按工资排序工资高的排在前面 验证第三条如果工资相当则按入职年数排序入职时 ...
- 我的Java开发学习之旅------>二进制、八进制、十进制、十六进制之间转换
一. 十进制与二进制之间的转换 (1) 十进制转换为二进制,分为整数部分和小数部分 ① 整数部分 方法:除2取余法,即每次将整数部分除以2,余数为该位权上的数,而商继续除以2,余数又为上一个位权 ...
- 我的Java开发学习之旅------>Base64的编码思想以及Java实现
Base64是一种用64个字符来表示任意二进制数据的方法. 用记事本打开exe.jpg.pdf这些文件时,我们都会看到一大堆乱码,因为二进制文件包含很多无法显示和打印的字符,所以,如果要让记事本这样的 ...
- 我的Java开发学习之旅------>System.nanoTime与System.currentTimeMillis的区别
首先来看一道题:下面代码的输出结果是什么? import java.util.HashMap; import java.util.Map; public class HashMapTest { pub ...
随机推荐
- 洛谷1373小a和uim之大逃离
题目背景 小a和uim来到雨林中探险.突然一阵北风吹来,一片乌云从北部天边急涌过来,还伴着一道道闪电,一阵阵雷声.刹那间,狂风大作,乌云布满了天空,紧接着豆大的雨点从天空中打落下来,只见前方出现了一个 ...
- sublime去除空白行和重复行
去除空白行 edit -> line -> delete blank lines 去除重复行 打开正则模式 1 edit-> sort lines 2 command+option+ ...
- DotnetBrowser入门教程-(2)启动简单的Web服务
微软的网页服务向来与IIS捆绑紧密,虽然.net core可以脱离iis了,但是基于国内的xp系统,.net core类库的精简,使得我们仍然在dotnetbrowser增加了对web服务的支持. 先 ...
- 如何查看linux版本 如何查看LINUX是多少位
一.如何得知自己正在使用的linux是什么版本呢,下面的几种方法将给你带来答案! 1. 查看内核版本命令: 1) [root@q1test01 ~]# cat /proc/version Linux ...
- 关于文本处理sort-cut-wc详解
sort sort命令对File参数指定的文件中的行排序,并将结果写到标准输出.如果 File 参数指定多个文件,那么 sort 命令将这些文件连接起来,并当作一个文件进行排序. sort语法 [ ...
- selenium用java找到表格某一行某一列中含有特定文字的某个元素
html部分代码如下: <tbody> <tr class="odd"> <td>1609</td> <td>-YOUK ...
- 如何Enable FireFox里的Java Plugin
步骤,Tools->Add-ons->Plugins 然后把Java(TM) PlatformXXX...的状态修改为Always Activate 如下图:
- http Keep-Alive
1.什么是Keep-Alive模式? 我们知道HTTP协议采用“请求-应答”模式,当使用普通模式,即非KeepAlive模式时,每个请求/应答客户和服务器都要新建一个连接,完成之后立即断开连接(HTT ...
- 【React Native开发】React Native控件之DrawerLayoutAndroid抽屉导航切换组件解说(13)
),请不要反复加群! 欢迎各位大牛,React Native技术爱好者增加交流!同一时候博客左側欢迎微信扫描关注订阅号,移动技术干货,精彩文章技术推送! 该DrawerLayoutAndroid组件封 ...
- linux 安装jdk和tomcat
安装jdk 下载相关jdk .rpm包,如:jdk-8u31-linux-i586.rpm 解压:#rpm -ivh jdk-8u31-linux-i586.rpm 配置环境变量:#vi /etc/ ...