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

52 阅读3分钟

新知识点总结

  1. 栈(Stack)

    • 栈是一种只能在一端进行插入或删除的线性表,遵循后进先出(LIFO)的原则。常用的操作包括 push(入栈)、pop(出栈)和 peek(查看栈顶元素)。
  2. 模拟过程

    • 使用栈来模拟火车进出休息区的过程。通过维护一个栈和一个当前需要驶出的火车编号索引来判断是否可以按照给定顺序驶出火车。
  3. 条件判断

    • 使用 while 循环和条件判断来检查栈顶元素是否与当前需要驶出的火车编号相同,如果相同则出栈并移动索引。
  4. 函数定义和调用

    • 定义一个函数 solution,接受三个参数 n(火车数量)、a(进入休息区的火车顺序)和 b(驶出休息区的火车顺序),并返回布尔值表示是否可以按顺序驶出。
    • 在主程序中调用该函数并打印结果,以验证函数的正确性。

分析与理解

问题背景

给定两列火车的顺序,第一列火车按照顺序 a 进入休息区,第二列火车按照顺序 b 驶出休息区。我们需要判断是否可以通过栈(休息区)来实现这一过程。

解决方案

  1. 初始化辅助栈和索引

    • 使用一个栈 stack 来模拟火车进入休息区的过程。
    • 使用一个变量 cur_out 来记录当前需要驶出的火车编号索引,初始值为 0。
  2. 模拟火车进出过程

    • 遍历进入休息区的火车顺序 a,将每辆火车 train 入栈。
    • 使用 while 循环检查栈顶元素是否与当前需要驶出的火车编号 b[cur_out] 相同,如果相同则出栈并将 cur_out 增加 1。
  3. 检查结果

    • 如果所有火车都已经按照顺序驶出,则栈应该是空的,且 cur_out 应该等于 n
    • 返回 cur_out == n and not stack,表示所有火车都已经按照顺序驶出。

代码实现

python
深色版本
def solution(n: int, a: list, b: list) -> bool:
    stack = []  # 辅助栈
    cur_out = 0  # 当前应该驶出的火车编号索引
    
    for train in a:
        stack.append(train)  # 火车进入休息区
        # 尝试驶出火车,只要栈顶元素与当前要驶出的火车编号相同
        while stack and stack[-1] == b[cur_out]:
            stack.pop()
            cur_out += 1
    
    # 如果所有火车都已经按照顺序驶出,则栈应该是空的
    return cur_out == n and not stack

# 测试代码
if __name__ == '__main__':
    print(solution(3, [1, 2, 3], [1, 2, 3]) == True)
    print(solution(3, [1, 2, 3], [3, 2, 1]) == True)
    print(solution(3, [1, 2, 3], [3, 1, 2]) == False)

学习建议

  1. 理解基本概念

    • 在深入研究具体的题目之前,先花时间理解栈的基本概念和操作,如 pushpop 和 peek。这些是解决此类问题的基础。
  2. 练习经典问题

    • 经典问题如括号匹配、栈的应用等都是很好的练习材料。这些问题能够帮助巩固对栈的理解,并学会如何应用栈解决实际问题。
  3. 逐步构建解决方案

    • 当面对一个新的问题时,尝试先手动解决几个小规模的例子,这有助于理解问题的本质并发现规律。之后,再尝试将其转化为算法或代码实现。
  4. 优化代码

    • 学会使用更简洁的语法,使代码更加优雅和高效。例如,使用 while 循环和条件判断来替代多重嵌套的 if 语句。
  5. 多做题,多思考

    • 实践是检验真理的唯一标准。通过不断地练习和思考,你会逐渐建立起对问题的感觉,遇到新问题时也能更加从容应对。