题解 | #火车进站#
火车进站
https://www.nowcoder.com/practice/97ba57c35e9f4749826dc3befaeae109
import java.util.*;
/**
思路:照搬大佬!!!
*/
public class Main {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
// 注意 hasNext 和 hasNextLine 的区别
while (in.hasNextInt()) { // 注意 while 处理多个 case
int n = in.nextInt();
int[] arr = new int[n];
for(int i = 0; i < n; i++){
arr[i] = in.nextInt();
}
Stack<Integer> stack = new Stack<>();
List<String> list = new ArrayList<>();
//采用递归思想
trainOut(arr,0,0, stack, "", list);
//结果排序
Collections.sort(list);
//输出结果
for(String s : list){
System.out.println(s);
}
}
}
/**
arr 数据
input,output 分别为入栈or出栈次数
stack 出入的栈
s 每一种循环的结果
list 存储所有结果
*/
private static void trainOut(int[] arr, int input, int output, Stack<Integer> stack, String s, List<String> list){
//结束条件:全部火车都已出栈,保存出栈结果
if(output == arr.length){
list.add(s);
}
//右边情况
if(input < arr.length){
stack.push(arr[input]);
//前面i+1个火车已经确定, 通过递归求后面所有情况
trainOut(arr,input + 1, output, stack, s, list);
stack.pop();//溯回 - 即恢复进入循环前的状态
}
//中间先出栈,再考虑右边的情况
if(!stack.isEmpty()){
int temp = stack.pop();
trainOut(arr, input, output + 1, stack, s + temp + " ", list);
stack.push(temp);//溯回
}
}
}

腾讯公司福利 1143人发布