问题描述
小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.获取一个栈所有可能的输出方式,然后和目标输出方式进行匹配,看看是否在集合当中。
显然,第二种方法的时间空间复杂度都较高,直接实现第一种,基本的算法步骤如下
算法步骤
-
初始化一个栈:用于模拟火车驶入休息区的过程。
-
遍历驶入顺序:将火车按驶入顺序依次压入栈中。
-
模拟驶出过程
- 每次压入一个火车后,检查栈顶元素是否与当前期望的驶出顺序一致。
- 如果一致,则将栈顶元素弹出,并继续检查下一个期望的驶出顺序。
-
验证结果:如果所有火车都能按期望的驶出顺序驶出,则返回
True
;否则返回False
。
到了这一步,题目就变的清晰啦,接下来就是编码时刻。编码的时候一定要保证逻辑清晰,这样才能高效编码。
通过前面几道题目可以做一个小总结: 栈的话考察的主要就是“先入后出”这样一个性质,灵活的考察点就是入栈之后什么时间出栈。做题的时候这一点需要认真考虑一下,最好手写两个例子来验证。而且虽然思路没问题,但是可能代码有问题,调试也是一项重要的基本功。