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

139 阅读2分钟

问题描述

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

例如:如果火车的驶入顺序是123,驶出顺序是3 2 1,这是可能的;如果驶出顺序是3 1 2,则是不 可能的。 这是一个典型的栈操作模拟问题,可以用栈的特性来验证给定的火车进站和出站顺序是否可行。我们通过模拟火车的进出站过程来解决问题。

解题思路

  1. 用栈模拟火车进站出站:

    • 将火车按顺序从 a 中依次“进栈”。
    • 每次将栈顶的火车与 b 中的当前出站顺序进行对比。
    • 如果相同,栈顶出栈,并移动出站顺序指针;如果不同,则继续将下一列火车进栈。
  2. 验证条件:

    • 如果最终能按照出站顺序 b 完全出栈,则说明该出站顺序是可行的;
    • 如果无法完成操作,则说明顺序不可行。
  3. 核心规则:

    • 栈遵循“后进先出”,即只有栈顶的火车可以出站。
    • 必须严格按照给定顺序进行模拟。

以下是实现代码:

def solution(n: int, a: list, b: list) -> bool:
    stack = []
    index = 0  # 指向出站序列 b 的当前元素

    # 遍历进站序列 a
    for train in a:
        stack.append(train)  # 火车进栈
        # 当栈顶元素和当前出站顺序相同时,出栈
        while stack and stack[-1] == b[index]:
            stack.pop()
            index += 1  # 移动到下一个出站元素

    # 如果栈为空,说明可以匹配出站顺序
    return len(stack) == 0

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

代码运行逻辑

  1. 将每一列火车从 a 中依次入栈。

  2. 如果栈顶火车与 b 中的当前出站顺序相同,则将其弹出。

  3. 最终检查栈是否为空:

    • 如果为空,则表示所有火车都按照顺序成功出栈,返回 True
    • 如果不为空,则表示存在无法匹配的火车顺序,返回 False