這題java的討論 好少..
這題跟 前面 a229 挺類似
輸入會給我們 一個n 接下來會有個n個數 n是最大值
例 n =3 所以要排列 1,2,3
接下來都以n=3為例
所以 我先初始個Arraylist 裡面有 1到n 現在ArraysList 有 {1,2,3} 以及一個答案字串 一開始會空白
第一種 3開頭的 有321 312
仔細觀察會發現 每種位置 都會先把較大的數字 排過一遍 在排小的一遍 (這裡好難解釋 反正就自己看出來八XD )
首先 一開始 我傳給函式一個 Arraylist 裡面有要排的數字 以及一個名為 answer的字串 來放排過的數字 (一開始是空白畢竟甚麼都還沒開始排)
一開始 會有3個分支 由大到小 先是 3 再來2 再來 1
第一個會先處理開頭為數字 3
answer 現在為3 把3 從Arraylist 中取出 現在 還有 {1,2}
因為 Arraylist裡還有排的數字 再將 answer 跟 Arraylist 傳回函式
此時 又會有分支 一個是在第二個放置 放1 一個是放2 由於是大到小 所以 2會優先處理
answer 現在為 32 把 2 從 Arraylist 取出 現在 剩 {1}
由於 只剩一個數字 所以不會再有分支 直接將 1 放上answer 並從Arraylist 取出 (Arraylist 現為空)
接下來 函式發現要排的數字已經為空 所以將answer 貼出
處理完 3 2 1 換處理 3 1 2
3開頭的處理完
換2開頭 ..... 以此類推
我不太會打文章 可能會看不懂@@
以下為Code:
number2 是用來記錄取出之前 的Arraylist
當處理分支時在把Arraylist 變回去
answer2 同理 紀錄 加上數字之前的answer
import java.util.ArrayList;
import java.util.Scanner;
public class a524 {
public static void main (String[] args){
Scanner input = new Scanner (System.in);
while (input.hasNextInt()){
int n = input.nextInt();
ArrayList<Integer> number = new ArrayList<>(n);
for (int i=0;i<n;i++){
number.add(i+1);
}
answer(number,"");
}
}
public static void answer (ArrayList<Integer> Arrays,String answer){
if (Arrays.isEmpty()==true) {
System.out.println(answer);
return;
}
ArrayList<Integer> number2 = new ArrayList<>();
number2.addAll(Arrays);//保留原始 ArraysList;
String answer2=answer;
for (int i=number2.size()-1;i>=0;i--){
answer = answer + number2.get(i);
Arrays.remove(i);
answer(Arrays,answer);
Arrays.clear();
Arrays.addAll(number2);
answer = answer2;
}
}
}