一、题目描述
给定一个正整数N代表火车数量,0<N<10,接下来输入火车入站的序列,一共N辆火车,每辆火车以数字1-9编号,火车站只有一个方向进出,同时停靠在火车站的列车中,只有后进站的出站了,先进站的才能出站。
要求输出所有火车出站的方案,以字典序排序输出。
二、输入描述
第一行输入一个正整数N(0 < N <= 10),第二行包括N个正整数,范围为1到10。
三、输出描述
输出以字典序从小到大排序的火车出站序列号,每个编号以空格隔开,每个输出序列换行。
四、解题思路
- 首先通过输入获取火车的数量N和火车入站序列id;
- 创建一个结果集列表,用于存储所有火车出站的方案;
- 创建一个栈,用于模拟火车的进站和出站过程;
- 调用递归函数trainOut,开始计算火车出站的方案;
- 递归函数trainOut的参数包括当前考虑的火车编号i,当前栈的状态s,当前已出站的火车序列str,已出站的火车数量n;
- 如果所有火车均已出站(n等于火车数量N),将当前结果保存到结果集列表中;
- 如果栈非空,表示可以将栈顶火车出栈,将栈顶元素弹出,递归调用trainOut函数,更新已出站的火车序列和数量;
- 将弹出的火车编号加入结果序列str,并加上空格;
- 恢复栈的状态,将弹出的火车编号重新入栈;
- 如果还有未考虑的火车(i小于火车数量N),将下一辆火车入栈,递归调用trainOut函数,更新已出站的火车序列和数量;
- 恢复栈的状态,将最近入栈的火车出栈;
- 最后,对结果集列表进行字典序排序,并依次输出每个出站序列;
五、Java算法源码
private static List<String> l = new ArrayList<>(); //储存结果
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
while (sc.hasNext()) {
l.clear(); //静态变量,每次先清空
int nums = sc.nextInt();
int[] id = new int[nums];
Stack<Integer> stack = new Stack<>();
for (int i = 0; i < nums; i++) {
id[i] = sc.nextInt();
}
trainOut(id, 0, stack, "", 0);
//对结果集排序
Collections.sort(l);
for (String str : l) {
System.out.println(str);
}
}
sc.close();
}
private static void trainOut(int[] id, int i, Stack<Integer> s, String str, int n) {
if (n == id.length) {
l.add(str); //如果所有火车均出栈则将当前结果保存
}
if (!s.empty()) { //栈非空时出栈
int temp = s.pop();
trainOut(id, i, s, str + temp + " ", n + 1);
s.push(temp); //恢复现场
}
if (i < id.length) {
s.push(id[i]);
trainOut(id, i + 1, s, str, n);
s.pop(); //恢复现场
}
}
六、效果展示
🏆下一篇:华为OD机试真题 Java 实现【基站维修工程师】【2023Q1 200分】,附详细解题思路
🏆本文收录于,华为OD机试(JAVA)(2022&2023)
本专栏包含了最新最全的2023年华为OD机试真题,有详细的分析和Java解答。已帮助1000+同学顺利通过OD机考。专栏会持续更新,每天在线答疑。