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(); } } }