cp了评论区点赞最多的大佬代码,贴一下
火车进站
https://www.nowcoder.com/practice/97ba57c35e9f4749826dc3befaeae109
import java.util.*;
public class Main {
static List<String> output = new ArrayList<>();
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
int count = in.nextInt();
int[] numbers = new int[count];
for (int i = 0; i < count; i++) {
numbers[i] = in.nextInt();
}
Stack<Integer> stack = new Stack<>();
String curOut = "";
process(numbers, stack, 0, curOut);
Collections.sort(output);
for (int i = 0; i < output.size(); i++) {
char[] charArray = output.get(i).toCharArray();
for (int k = 0; k < charArray.length; k++) {
if (k == charArray.length - 1) {
System.out.print(charArray[k]);
} else {
System.out.print(charArray[k] + " ");
}
}
System.out.println();
}
}
/**
* stack要么进,要么出。先进一个,处理完这个进的,然后恢复原样;再出,处理完这个出的,就完事了。
* * @param numbers 编号数组 * @param stack 核心栈 * @param i 当前编号 * @param curOut 当前已经出栈的数字
*/
public static void process(int[] numbers, Stack<Integer> stack, int i,
String curOut) {
//如果出栈数字已经满了,就先添加
if (curOut.length() == numbers.length) {
output.add(curOut);
}
//如果出栈的数字没有满,此时可以出栈也可以进栈,都可以。
// 这里先做出栈
// 出栈需要建立在栈本身不为空的基础上
if (!stack.isEmpty()) {
//出栈
int temp = stack.pop();
//继续后面的动作,一条路走到黑
// 出栈,该数组添加temp
process(numbers, stack, i, curOut + temp);
//这种出栈的场景走完后,下一个场景,进栈,不过先恢复原样
stack.push(temp);
}
//开始做入栈场景
// 入账时要确保还有数据入账
if (i < numbers.length) {
//入账
int temp2 = numbers[i];
stack.push(temp2);
//继续后面的操作,一条路走到黑
// i位置移动到下一个
process(numbers, stack, i + 1, curOut);
//这种场景走完后,恢复原样
stack.pop();
}
}
}

