#29289: JAVA AC 用Arrayslist 解釋 附解答


wer12369qaz15963@gmail.com (dentr)

學校 : 新北市立清水高中
編號 : 174903
來源 : [111.248.152.60]
最後登入時間 :
2022-07-26 15:13:49
a524. 手機之謎 | From: [219.84.98.239] | 發表日期 : 2022-02-12 19:39

這題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;
}
}
}

             

 
ZeroJudge Forum