将1到n的所有排列全部都输出来,称之为全排列问题。比如当n=3时,有6个排列输出:(1,2,3), (1,3,2), (2,1,3), (2,3,1), (3,1,2), (3,2,1)。而根据所学的排列组合知识,不能得出1到n的全排列个数有n!个。那么,如何将这n!个全排列记录下来或者输出呢?
这个问题在网上有很多种解法,但是我感觉这些解法都难以理解,而且不够直观。接下来,我将采用递归+栈的方式去实现。
1到n的一个全排列,实际上对应n个位置,我们可以1个位置1个位置的放。关键实现代码如下:
private void constructSinglePermutation(LinkedStack<Integer> stack, int n){
if (n == upperLimit){
totalCount++;
StringBuffer sb = new StringBuffer();
for (Integer integer : stack){
sb.append(integer + 1);
sb.append(" ");
}
System.out.println(sb.toString());
return;
}
for (int i = 0; i < upperLimit; i++){
boolean hasPreIn = false;
for (Integer preInt : stack){
if (preInt.intValue() == i){
hasPreIn = true;
break;
}
}
if (!hasPreIn){
stack.push(i);
constructSinglePermutation(stack, n + 1);
stack.pop();
}
}
}