火车站的列车调度铁轨的结构如下所示: (Exit) 9 8 7 6 5 4 3 2 1 <==== ………………………………… <==== 8 4 2 5 3 9 1 6 7 (Entrance) 两端分别是一条入口(Entrance)轨道和一条出口(Exit)轨道,它们之间可能有N条平行的轨道。每趟列车从入口可以选择任意一条轨道进入排队,以方便最后有序从出口离开。在前例中有9趟列车,在入口处按照{8,4,2,5,3,9,1,6,7}的顺序排队等待进入。如果要求它们必须按序号递减的顺序从出口离开,则至少需要多少条平行铁轨用于调度?调度入队后,各个队列里车厢情况如何?
输入格式: 输入第一行给出一个整数N (2 ≤ N ≤99 ),下一行给出从1到N的整数序号的一个重排列。数字间以空格分隔。
输出格式: 第一行输出1号车厢所在的队列中的元素(车厢编号间以空格分隔),注意,调度时,车厢只进入队列等待,并不出队。 在第二行中输出可以将输入的列车按序号递减的顺序重排所需要最少的辅助铁轨(队列)条数。
输入样例:
9
8 4 2 5 3 9 1 6 7
输出样例:
8 4 2 1
4
代码如下:
import java.util.ArrayList;
import java.util.Scanner;
import java.util.Stack;
public class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int n = scanner.nextInt();
int[] train = new int[n];
for (int i = 0; i < n; i ++) {
train[i] = scanner.nextInt();
}
ArrayList<Stack<Integer>> arrayList = new ArrayList<>();
for (int i = 0; i < n; i ++) {
if (arrayList.size() == 0) {
Stack<Integer> stack0 = new Stack<>();
stack0.push(train[0]);
arrayList.add(stack0);
} else {
int j = 0;
for (; j < arrayList.size(); j ++) {
if (train[i] < arrayList.get(j).peek()) {
arrayList.get(j).push(train[i]);
break;
}
}
//如果把这个if语句放到循环体里面,arraylist的大小每次加一,j也每次加一
//那么这个循环体将一直循环下去,所以应该把这个语句放在循环体外面
if (j == arrayList.size()) {
Stack<Integer> stack1 = new Stack<>();
stack1.push(train[i]);
arrayList.add(stack1);
}
}
}
for (int i = 0; i < arrayList.get(0).size() - 1; i ++) {
System.out.print(arrayList.get(0).get(i) + " ");
}
System.out.println(arrayList.get(0).pop());
System.out.println(arrayList.size());
}
}