火车驶入与驶出顺序验证 | 豆包MarsCode AI刷题

101 阅读4分钟

题目解析

在这个问题中,我们需要验证火车的驶入和驶出顺序是否符合栈的先进后出(LIFO)原则。火车在进入休息区后,可以按顺序驶入或停留,然后根据休息区的规则依次驶出。这个问题可以通过栈的特性来解决,栈是一种后进先出(LIFO)的数据结构,适合用来模拟火车的进出过程。问题描述:

  • 输入:两个数组 a 和 b,分别表示火车的驶入顺序和驶出顺序。

  • 输出:一个布尔值,表示给定的出栈顺序是否可能。

示例:

  • 如果火车的驶入顺序是 [1, 2, 3],驶出顺序是 [3, 2, 1],这是可能的,因为火车可以按顺序驶入栈中,然后再按相反顺序出栈。

  • 如果出栈顺序是 [3, 1, 2],则是不可能的,因为在出栈 1 时,3 已经出栈,无法再出栈 2。

解决思路

我们可以使用一个栈来模拟火车的进出过程。具体步骤如下:

  1. 初始化栈:创建一个空栈来存放驶入的火车。

  2. 遍历出栈序列:对于每一辆需要出栈的火车,首先检查栈顶是否是该火车。如果不是,则将驶入序列中的火车依次入栈,直到栈顶是目标火车或所有火车都已入栈。

3. 出栈操作:如果栈顶是目标火车,则将其出栈;如果栈为空或栈顶不是目标火车,则返回 false。

  1. 最终检查:如果所有火车都能按顺序出栈,返回 true。

代码实现

以下是实现该逻辑的 Java 代码:

import java.util.Stack;

public class Main {

    public static boolean solution(int n, int[] a, int[] b) {

        if(a == null || b == null || a.length != n || b.length != n) {

            return false;

        }

        Stack stack = new Stack<>();

        int inIndex = 0; // 将要驶入的火车的索引

        

        // 遍历出栈序列

        for(int train : b) {

            while(inIndex < n && (stack.isEmpty() || stack.peek() != train)) {

                // 让a中元素入栈

                stack.push(a[inIndex]);

                inIndex++;

            }

            if(!stack.isEmpty() && stack.peek() == train) {

                stack.pop();

            } else {

                return false;

            }

        }

        return stack.isEmpty();

    }

    public static void main(String[] args) {

        System.out.println(solution(3, new int[]{1, 2, 3}, new int[]{1, 2, 3}) == true);

        System.out.println(solution(3, new int[]{1, 2, 3}, new int[]{3, 2, 1}) == true);

        System.out.println(solution(3, new int[]{1, 2, 3}, new int[]{3, 1, 2}) == false);

    }

}

代码详解

  1. 输入验证:首先检查输入的数组是否为空,或者长度是否匹配。如果不匹配,直接返回 false。

  2. 栈的使用:使用 Stack 来存放驶入的火车。inIndex 用于跟踪当前要驶入的火车的索引。

3. 出栈逻辑:对于每一辆需要出栈的火车 train,我们首先检查栈顶是否是该火车。如果不是,则将 a 中的火车依次入栈,直到栈顶是目标火车或所有火车都已入栈。 4. 出栈操作:如果栈顶是目标火车,则将其出栈;如果栈为空或栈顶不是目标火车,则返回 false。 5. 最终返回:如果所有火车都能按顺序出栈,返回 true。

知识总结

在使用豆包MarsCode AI刷题的过程中,我总结了以下几点新知识:

  • 栈的基本操作:了解栈的入栈和出栈操作是解决此类问题的关键。栈的特性使得我们可以轻松模拟火车的进出过程。

  • 时间复杂度:该算法的时间复杂度为 O(n),因为每辆火车最多只会入栈和出栈一次。这使得算法在处理大规模数据时依然高效。

  • 边界条件处理:在实现中需要考虑输入数组为空或长度不匹配的情况,确保代码的健壮性。

学习计划

结合豆包MarsCode AI刷题功能,我制定了以下高效学习方法:

  • 制定刷题计划:每天固定时间进行刷题,选择不同类型的问题以提高综合能力。可以设定每周的主题,例如栈、队列、动态规划等,确保全面覆盖。

  • 利用错题进行针对性学习:记录错题,分析错误原因,进行针对性练习。可以将错题整理成笔记,定期复习,帮助加深记忆。

3. 定期复习:每周复习之前做过的题目,巩固记忆。可以使用间隔重复法,帮助记忆更持久。

工具运用

我将 AI 刷题功能与其他学习资源相结合,取得了更好的学习效果。例如:

  • 结合视频教程:在刷题时观看相关视频,帮助理解复杂的算法。视频中的讲解可以提供不同的视角,帮助更好地理解问题。

  • 参与讨论:在学习社区中与其他同学讨论问题,分享解题思路和经验。通过讨论,可以获得新的思路和方法,拓宽自己的视野。

  • 使用在线编程平台:在刷题时,使用在线编程平台进行实时测试,帮助快速验证自己的代码。

通过这些方法,我的编程能力得到了显著提升。在学习编程的过程中,保持耐心和恒心是非常重要的,遇到困难时不要气馁,积极寻求帮助和资源,最终一定能取得进步。