青训营X豆包MarsCode 技术训练营第一课 | 豆包MarsCode AI 刷题

116 阅读3分钟

第287题火车驶入驶出顺序验证问题: 思路如下: 初始化栈: 创建一个空栈 stack,用于模拟火车的驶入和驶出过程。 遍历驶入顺序 a: 使用一个指针 i 来遍历驶入顺序 a。 对于每个驶入的火车 a[i],将其压入栈中。 检查栈顶元素与驶出顺序 b: 使用一个指针 j 来遍历驶出顺序 b。 每次将一个火车压入栈后,检查栈顶元素是否与当前期望的驶出顺序 b[j] 匹配。 如果匹配,则将栈顶元素弹出,并移动指针 j 到下一个驶出顺序元素。 继续这个过程,直到栈为空或栈顶元素与当前期望的驶出顺序不匹配。 最终检查: 如果栈为空且指针 j 已经遍历完驶出顺序 b 中的所有元素,则说明驶入和驶出顺序是可能的。 否则,说明不可能。 示例 假设 a = [1, 2, 3] 和 b = [3, 2, 1]: 初始化栈 stack = [],指针 i = 0,指针 j = 0。 遍历 a: 压入 1,栈 stack = [1],检查栈顶元素 1 是否等于 b[0](3),不匹配。 压入 2,栈 stack = [1, 2],检查栈顶元素 2 是否等于 b[0](3),不匹配。 压入 3,栈 stack = [1, 2, 3],检查栈顶元素 3 是否等于 b[0](3),匹配,弹出 3,栈 stack = [1, 2],指针 j 移动到 1。 检查栈顶元素 2 是否等于 b[1](2),匹配,弹出 2,栈 stack = [1],指针 j 移动到 2。 检查栈顶元素 1 是否等于 b[2](1),匹配,弹出 1,栈 stack = [],指针 j 移动到 3。 栈为空且指针 j 已经遍历完 b 中的所有元素,说明驶入和驶出顺序是可能的。 这题主要使用了以下知识点:

栈(Stack):

栈是一种后进先出(LIFO, Last In First Out)的数据结构。在这段代码中,栈用于模拟火车的进出顺序。 stack.append(a[i]) 将当前火车驶入栈中。 stack.pop() 将栈顶元素弹出,表示火车驶出。 循环(Loops):

使用 for 循环遍历驶入顺序 a。 使用 while 循环检查栈顶元素是否与当前期望的驶出顺序 b[j] 匹配。 条件判断(Conditional Statements):

使用 if 语句和 while 循环中的条件判断来检查栈顶元素是否与当前期望的驶出顺序匹配。 列表(Lists):

使用列表 a 和 b 分别表示驶入顺序和驶出顺序。 通过索引访问列表中的元素,例如 a[i] 和 b[j]。 指针(Pointers):

使用变量 j 作为指针,指向当前期望的驶出顺序 b 中的元素。 当栈顶元素与 b[j] 匹配时,指针 j 向前移动。 函数定义和调用(Function Definition and Calling):

定义了一个名为 solution 的函数,接受三个参数:整数 n、列表 a 和列表 b。 在主程序中使用 if name == 'main': 块来测试该函数。 返回值(Return Value):

函数 solution 返回一个布尔值,表示是否可以通过栈操作使驶入顺序 a 变为驶出顺序 b。 逻辑运算(Logical Operations):

使用逻辑运算符 and 来组合两个条件:栈为空且所有驶出顺序 b 中的元素都被匹配。 这些知识点共同构成了解决火车调度问题的基本思路和实现方法。