面试题如下:把一个数组里的数组合全部列出,比如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(Listcandidate, 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(Listcandidate, 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(Listcandidate, 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
==================================================================================================
作者:欧阳鹏 欢迎转载,与人分享是进步的源泉!
转载请保留原文地址:
==================================================================================================