青训营:刷题:栈 火车驶入驶出 | 豆包MarsCode AI刷题

32 阅读2分钟

问题描述

小F在观察火车驶入和驶出休息区的顺序时,注意到休息区的结构类似于栈,即遵循先进后出的规则。她记录了火车驶入和驶出的顺序,并希望验证这些顺序是否可能实际发生。火车在进入休息区后可以按顺序驶入或停留,然后根据休息区的规则依次驶出。你的任务是帮助小F验证所记录的火车驶入和驶出顺序是否能够被满足。

例如:如果火车的驶入顺序是 1 2 3,驶出顺序是 3 2 1,这是可能的;如果驶出顺序是 3 1 2,则是不可能的。


测试样例

样例1:

输入:n = 3, a = [1, 2, 3], b = [1, 2, 3] 输出:True

样例2:

输入:n = 3, a = [1, 2, 3], b = [3, 2, 1] 输出:True

样例3:

输入:n = 3, a = [1, 2, 3], b = [3, 1, 2] 输出:False

题目分析:

这个题目理解起来较为简单,就是看看是否符合栈先入后出的规则,这也是栈的最大特性

这道题目通常在笔试的选择题中会出现,代码实现让我们来思考一下

这道题的实现就无非两种思路

1.没入栈一个数字就看看是否和输出的数字相同,如果相同,则弹出,压入下一个数字

2.获取一个栈所有可能的输出方式,然后和目标输出方式进行匹配,看看是否在集合当中。

显然,第二种方法的时间空间复杂度都较高,直接实现第一种,基本的算法步骤如下

算法步骤

  1. 初始化一个栈:用于模拟火车驶入休息区的过程。

  2. 遍历驶入顺序:将火车按驶入顺序依次压入栈中。

  3. 模拟驶出过程

    • 每次压入一个火车后,检查栈顶元素是否与当前期望的驶出顺序一致。
    • 如果一致,则将栈顶元素弹出,并继续检查下一个期望的驶出顺序。
  4. 验证结果:如果所有火车都能按期望的驶出顺序驶出,则返回 True;否则返回 False

到了这一步,题目就变的清晰啦,接下来就是编码时刻。编码的时候一定要保证逻辑清晰,这样才能高效编码。

image.png

通过前面几道题目可以做一个小总结: 栈的话考察的主要就是“先入后出”这样一个性质,灵活的考察点就是入栈之后什么时间出栈。做题的时候这一点需要认真考虑一下,最好手写两个例子来验证。而且虽然思路没问题,但是可能代码有问题,调试也是一项重要的基本功。