0
点赞
收藏
分享

微信扫一扫

华为OD机试真题 Java 实现【火车进站】【牛客练习题】

一、题目描述

给定一个正整数N代表火车数量,0<N<10,接下来输入火车入站的序列,一共N辆火车,每辆火车以数字1-9编号,火车站只有一个方向进出,同时停靠在火车站的列车中,只有后进站的出站了,先进站的才能出站。

要求输出所有火车出站的方案,以字典序排序输出。

二、输入描述

第一行输入一个正整数N(0 < N <= 10),第二行包括N个正整数,范围为1到10。

三、输出描述

输出以字典序从小到大排序的火车出站序列号,每个编号以空格隔开,每个输出序列换行。

四、解题思路

  1. 首先通过输入获取火车的数量N和火车入站序列id;
  2. 创建一个结果集列表,用于存储所有火车出站的方案;
  3. 创建一个栈,用于模拟火车的进站和出站过程;
  4. 调用递归函数trainOut,开始计算火车出站的方案;
  5. 递归函数trainOut的参数包括当前考虑的火车编号i,当前栈的状态s,当前已出站的火车序列str,已出站的火车数量n;
  6. 如果所有火车均已出站(n等于火车数量N),将当前结果保存到结果集列表中;
  7. 如果栈非空,表示可以将栈顶火车出栈,将栈顶元素弹出,递归调用trainOut函数,更新已出站的火车序列和数量;
  8. 将弹出的火车编号加入结果序列str,并加上空格;
  9. 恢复栈的状态,将弹出的火车编号重新入栈;
  10. 如果还有未考虑的火车(i小于火车数量N),将下一辆火车入栈,递归调用trainOut函数,更新已出站的火车序列和数量;
  11. 恢复栈的状态,将最近入栈的火车出栈;
  12. 最后,对结果集列表进行字典序排序,并依次输出每个出站序列;

五、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机考。专栏会持续更新,每天在线答疑。

在这里插入图片描述

举报

相关推荐

0 条评论