博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
我的Java开发学习之旅------>使用循环递归算法把数组里数据数组合全部列出
阅读量:5797 次
发布时间:2019-06-18

本文共 2682 字,大约阅读时间需要 8 分钟。

面试题如下:把一个数组里的数组合全部列出,比如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
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)); } }}

输出结果为:

112123131322212132323133131232321
为了便于理解,在循环中加一句 System.out.println("candidate is: " + candidate);

public static void listAll(List
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]1candidate is: [2, 3]12candidate is: [3]123candidate is: [2, 3]13candidate is: [2]132candidate is: [1, 2, 3]2candidate is: [1, 3]21candidate is: [3]213candidate is: [1, 3]23candidate is: [1]231candidate is: [1, 2, 3]3candidate is: [1, 2]31candidate is: [2]312candidate is: [1, 2]32candidate 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
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)); } }

打印结果为:

123132213231312321

去掉注释后,更加容易理解,打印结果为:

candidate is: [1, 2, 3]candidate is: [2, 3]candidate is: [3]123candidate is: [2, 3]candidate is: [2]132candidate is: [1, 2, 3]candidate is: [1, 3]candidate is: [3]213candidate is: [1, 3]candidate is: [1]231candidate is: [1, 2, 3]candidate is: [1, 2]candidate is: [2]312candidate is: [1, 2]candidate is: [1]321

==================================================================================================

  作者:欧阳鹏  欢迎转载,与人分享是进步的源泉!

  转载请保留原文地址

==================================================================================================

转载于:https://www.cnblogs.com/ouyangpeng/p/8538106.html

你可能感兴趣的文章
map集合修改其中元素 去除Map集合中所有具有相同值的元素 Properties长久保存的流操作 两种用map记录单词或字母个数的方法...
查看>>
码字定式之SQL(4)
查看>>
哈希表心得
查看>>
23、生鲜电商平台-服务器部署设计与架构
查看>>
数据结构——希尔排序(使用Java)
查看>>
设计模式之策略模式
查看>>
ceph(8)--关于Ceph PGs
查看>>
Scheduler 租户虚机到不同host
查看>>
jenkins-python3.6.8-ansible2.5 docker镜像创建
查看>>
[原]问题解决:/etc/fstab is read-only(add ! to override)
查看>>
CSS让div背景透明
查看>>
javaweb学习笔记
查看>>
MyEclipse中J2ee项目的一些Java文件报错!
查看>>
[Linux] Linux 守护进程的启动方法
查看>>
【Alpha】Daily Scrum Meeting——Day7
查看>>
arguments.callee
查看>>
安卓Visibility属性
查看>>
zabbix 自动发现与snmp监控
查看>>
Python Django 之 登录页面
查看>>
iOS UILabel设置居上对齐,居中对齐,居下对齐
查看>>