给一个数组比如{"1", "2", "3"},打印所有的组合排列,例如“123”、“132”、“231”、“213”……
思路:
- 先新建一个list存放下标
- 循环固定第n个下标
- 遍历数组跳过list中的下标,循环确定第n+1个
主要方法:
/**
* 对排列的第index进行操作,每一次都对数组遍历,跳过usedIndex已有的下标,
* 将a的剩下的下标循环添加到usedIndex的index位
* 最后按照usedIndex的顺序去数组取数拼成一个数
* @param a 目标数组
* @param usedIndex 已选定的下标
* @param index 继续将第几个数作为下标
*/
public static void process(String[] a, List<Integer> usedIndex, int index) {
if (usedIndex.size() >= a.length) {
System.out.println(generateNumByString(a, usedIndex));
}
for (int i = 0; i < a.length; i++) {
// 跳过usedIndex已有的下标,
if (usedIndex.contains(i)) {
continue;
}
usedIndex.add(index, i);
process(a, usedIndex, index + 1);
// 将上一步添加的下标删除,比如 0,1,2,3中index已经添加了0,
// 然后在usedIndex.add(index, i)添加了1变为(0,1),下一个循环应该添加2变为(0,2)
// 如果不删除,下一个循环就是直接添加变为(0,1,2),而不是(0,2)
usedIndex.remove(index);
}
}
main函数:
public static void main(String[] args) {
String[] a = new String[]{"1", "2", "3"};
// 存放数组下标的list
List<Integer> indexList = new LinkedList<>();
process(a, indexList, 0);
}
private static int generateNumByString(String[] a, List<Integer> usedIndex) {
StringBuilder sb = new StringBuilder();
for (int index : usedIndex) {
sb.append(a[index]);
}
return Integer.parseInt(sb.toString());
}