面试题如下:把一个数组里的数组合全部列出,比如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开发学习之旅------>使用循环递归算法把数组里数据数组合全部列出的更多相关文章

  1. 我的Java开发学习之旅------>Java 格式化类(java.util.Formatter)基本用法

    本文参考: http://docs.oracle.com/javase/1.5.0/docs/api/java/util/Formatter.html http://www.blogjava.net/ ...

  2. 我的Java开发学习之旅------>工具类:将播放器的进度值转换成相应的时间格式

    在我的博客<我的Java开发学习之旅------>Java 格式化类(java.util.Formatter)基本用法,地址:http://blog.csdn.net/ouyang_pen ...

  3. 我的Java开发学习之旅------>工具类:Java获取字符串和文件进行MD5值

    ps:这几天本人用百度云盘秒传了几部大片到云盘上,几个G的文件瞬秒竟然显示"上传成功"!这真让我目瞪口呆,要是这样的话,那得多快的网速,这绝对是不可能的,也许这仅是个假象.百度了一 ...

  4. 我的Java开发学习之旅------>工具类:Java使用正则表达式分离出字符串中的中文和英文

    今天看到一个工具类使用正则表达式将一大段字符串中的中文和英文都分离出来了,在此记录一下,读者可以收藏! import java.util.ArrayList; import java.util.Col ...

  5. 我的Java开发学习之旅------&gt;Base64的编码思想以及Java实现

    Base64是一种用64个字符来表示随意二进制数据的方法. 用记事本打开exe.jpg.pdf这些文件时,我们都会看到一大堆乱码,由于二进制文件包括非常多无法显示和打印的字符.所以,假设要让记事本这种 ...

  6. 我的Java开发学习之旅------>Java利用Comparator接口对多个排序条件进行处理

    一需求 二实现Comparator接口 三验证排序结果 验证第一条件首先按级别排序级别最高的排在前面 验证第二条如果级别相等那么按工资排序工资高的排在前面 验证第三条如果工资相当则按入职年数排序入职时 ...

  7. 我的Java开发学习之旅------>二进制、八进制、十进制、十六进制之间转换

    一. 十进制与二进制之间的转换  (1) 十进制转换为二进制,分为整数部分和小数部分  ① 整数部分  方法:除2取余法,即每次将整数部分除以2,余数为该位权上的数,而商继续除以2,余数又为上一个位权 ...

  8. 我的Java开发学习之旅------>Base64的编码思想以及Java实现

    Base64是一种用64个字符来表示任意二进制数据的方法. 用记事本打开exe.jpg.pdf这些文件时,我们都会看到一大堆乱码,因为二进制文件包含很多无法显示和打印的字符,所以,如果要让记事本这样的 ...

  9. 我的Java开发学习之旅------>System.nanoTime与System.currentTimeMillis的区别

    首先来看一道题:下面代码的输出结果是什么? import java.util.HashMap; import java.util.Map; public class HashMapTest { pub ...

随机推荐

  1. SDOI 2015 约束个数和

    Description: 共\(T \le 5 \times 10^4\)组询问, 每组询问给定\(n\)和\(m\), 请你求出 \[ \sum_{i = 1}^n \sum_{j = 1}^m \ ...

  2. 2017省选集训测试赛(二十五)Problem B recollection

    @(XSY)[后缀数组, 启发式合并, ST表] Description Solution 后缀数组 + 启发式合并 + Sparse Table. 这是第一次写树上后缀数组. 对以每个点为根的子树统 ...

  3. SecureCRT导出服务器列表或配置文件

    说明:SecureCRT没有Xshell那么简单有直接导出的功能,但是可以通过技巧的方式来操作. 1.打开SecureCRT,点击菜单栏的[Opitions]->[Global Opitions ...

  4. 查询执行慢的SQL

    --执行慢的SQL: SELECT S.SQL_TEXT, S.SQL_FULLTEXT, S.SQL_ID, ROUND(ELAPSED_TIME / 1000000 / (CASE WHEN (E ...

  5. 修改Linux基本配置

    1.修改主机名 vi /etc/sysconfig/network NETWORKING=yes HOSTNAME=server1.cn 2.修改ip地址 vi /etc/sysconfig/netw ...

  6. Another unnamed CacheManager already exists in the same VM

    今天学习Spring 缓存机制.遇到不少问题~ 好不easy缓存的单元測试用例调试成功了,在同一项目下单元測试另外一个文件时,发生了异常: org.springframework.beans.fact ...

  7. 启动Nginx目录浏览功能及 让用户通过用户名密码认证访问web站点

    一.启动Nginx目录浏览功能  [root@abcdocker extra]# cat w.conf server { listen 80; server_name IP地址; location / ...

  8. Sql 复习3之存储管理

    一.事务管理 单个工作单元称为事务,我们将若干条sql命令组合在一起,形成存储过程.触发器等,利用存储过程和触发器可以进行事务管理. 二.编程基础介绍 主要有:函数.程序设计语句等. 程序设计语句: ...

  9. hive分区(partition)简介

    一.背景 1.在Hive Select查询中一般会扫描整个表内容,会消耗很多时间做没必要的工作.有时候只需要扫描表中关心的一部分数据,因此建表时引入了partition概念. 2.分区表指的是在创建表 ...

  10. js:argument

    引用:http://www.cnblogs.com/lwbqqyumidi/archive/2012/12/03/2799833.html    http://www.cnblogs.com/Fskj ...