面试题如下:把一个数组里的数组合全部列出,比如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. POJ 2411 Mondriaan's Dream [经典状态压缩dp]

    题意:略. 思路:这一题开始做的时候完全没有思路,便去看了别人的题解. 首先,对于这个题目解法想有一个初步的了解,请看这里:http://www.2cto.com/kf/201208/146894.h ...

  2. 受检查异常要求try catch或者throws,但是要记住只要catch异常了,就不会向下继续抛了

    所以在框架中,要想异常被统一的异常拦截器处理,就要将受检查异常转换为运行异常,在受检查异常的catch时候,手动throw new runtime exception

  3. 维护一套同时兼容 iOS 6 和 iOS 7,并且能够自动适应两个系统的 UI 风格的代码

    举例:ios6:test.pngios7:ios7_test.png在ios7Image.plist中添加 "test" PS:如果要统一成ios7风格,可以看看UI7Kit yo ...

  4. mac搭建安卓开发环境

    下载 android studio,利用android studio自带sdk manager下载安卓sdk,在sdk manager中设置相关代理地址,下载完sdk后,在bash_profile中把 ...

  5. opengl interface

    glTranslate()是移动坐标系,比如glTranslate(-1.5,0,0),之后你画的图就是在屏幕左边1.5个单位~glRotation()是做旋转的,第一个参量是angle,后面3个分别 ...

  6. MySQL开发36条军规

    转载地址:http://blog.itpub.net/22664653/viewspace-723506/ 写在前面的话: 总是在灾难发生后,才想起容灾的重要性: 总是在吃过亏后,才记得曾经有人提醒过 ...

  7. 2015年度新增开源软件排名TOP100

    2015年度新增开源软件排名TOP100 本榜单包含2015年开源中国新收录的软件中,根据软件本身的关注度.活跃程度进行排名前100名的软件.从这份榜单中或许可以了解到最新业界的趋势. 1.Switc ...

  8. HM编码器代码阅读(14)——帧间预測之AMVP模式(二)predInterSearch函数

    简单介绍     predInterSearch基本的工作是ME(运动预计)和MC(运动补偿).     函数中有一个bTestNormalMC变量.它表示是否进行正常的MC过程,正常的MC过程就是进 ...

  9. HDU 4355 Party All the Time(三分|二分)

    题意:n个人,都要去參加活动,每一个人都有所在位置xi和Wi,每一个人没走S km,就会产生S^3*Wi的"不舒适度",求在何位置举办活动才干使全部人的"不舒适度&quo ...

  10. [ACM] HDU 5024 Wang Xifeng&#39;s Little Plot (构造,枚举)

    Wang Xifeng's Little Plot Problem Description <Dream of the Red Chamber>(also <The Story of ...