毕业一年多了,想复习一下旧知识,温故而知新,想起了全排列,就复习一遍;
全排列定义为:若有m个数或字母,选择其中的n个(n<=m)进行排列,并且排列不重复
思路:如1、2、3、4、5,每个数字都有机会在每个位置中出现,那就按顺序来排,先模仿一次
如第一次进入函数是时,将datas的第一个值付给nTarget然后压栈,从nData中删去对应的值,此时nDatas值为1,nTarget的值为2、3、4、5,然后压栈,然后进行第一次递归,按照上面的步骤,此时nData的值为1、2;nTarget为3、4、5.。。。其实大家可以调试下面的代码就能看出是如何进行的,我就不多说了
for (int i = 0; i < datas.size(); i++) {
List<Object> nDatas = new ArrayList<Object>(datas);
List<Object> nTarget = new ArrayList<Object>(target);
nTarget.add(nDatas.get(i));
nDatas.remove(i);
sortByNum(nDatas, nTarget, Num);
}
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Scanner;
public class Pailie {
private static void sortByNum(List datas, List target, Integer Num) {
if (target.size() == Num) {
for (Object obj : target)
System.out.print(obj);
System.out.println();
return;
}
for (int i = 0; i < datas.size(); i++) {
List<Object> newDatas = new ArrayList<Object>(datas);
List<Object> newTarget = new ArrayList<Object>(target);
newTarget.add(newDatas.get(i));
newDatas.remove(i);
sortByNum(newDatas, newTarget, Num);
}
}
public static void main(String[] args) {
String[] datas = new String[] { "1", "2", "3", "4", "5" };
while (true) {
Scanner scanner = new Scanner(System.in);
System.out.println("请重新输入需要排列的数组长度:");
String inputNum = scanner.nextLine();
Integer Num = Integer.parseInt(inputNum);
if (datas.length >= Num) {
sortByNum(Arrays.asList(datas), new ArrayList<Object>(), Num);
} else {
System.out.println("结束");
}
}
}
}