套碗游戏的取碗顺序问题| 豆包MarsCode AI刷题

123 阅读2分钟

一、题目解析

题目描述
小F在玩一个套碗游戏,碗从 1 到 n 编号,从大到小依次套在木棍上。每次只能取最上面的碗,需判断给定取碗顺序是否可行。

规则总结

  1. 碗只能从最上方依次取出。
  2. 若取碗顺序无法通过合法操作完成,返回 0;否则返回 1。

目标
给定碗数 n 和取碗顺序 a,判断是否可行。


二、解题思路

本题可以使用 栈(Stack) 来模拟碗的取出过程,检查是否能通过栈的操作完成给定的取碗顺序。

  1. 栈模拟的核心思想

    • 从编号为 1 到 n,依次将碗压入栈中。
    • 每次检查栈顶是否是当前需要取出的碗,若是则弹出栈顶;否则继续压入下一个碗。
  2. 算法流程

    • 初始化一个空栈 stack 和索引 index=0,表示当前需要取出的碗序号。

    • 遍历从 1 到 n 的所有碗编号 i:

      • 将 i 压入栈。

      • 检查栈顶是否是当前需要取出的碗a[index]:

        • 如果是,则弹出栈顶并更新 index。
    • 遍历结束后,如果栈清空且所有碗按顺序取出,则取碗顺序合法。

  3. 返回结果

    • 如果碗的顺序能通过上述模拟完成,返回 1;否则返回 0。

三、代码实现

以下是 Python 的代码实现:

python
复制代码
def solution(M: int, a: list) -> int:
    stack = []
    index = 0  # 当前需要取的碗的序号

    # 遍历所有碗编号
    for i in range(1, M + 1):
        stack.append(i)
        # 检查栈顶是否是当前需要取出的碗
        while stack and stack[-1] == a[index]:
            stack.pop()
            index += 1

    # 如果所有碗按顺序取出,栈应为空且 index 应该到达末尾
    return 1 if not stack and index == M else 0

# 测试用例
if __name__ == '__main__':
    print(solution(2, [1, 2]) == 1)  # 输出:1,合法
    print(solution(3, [3, 1, 2]) == 0)  # 输出:0,不合法
    print(solution(4, [1, 3, 2, 4]) == 1)  # 输出:1,合法

四、知识总结

  1. 栈的应用
    栈是一种后进先出的数据结构,非常适合模拟这种取碗顺序问题。

  2. 模拟思路

    • 压栈表示碗依次被放到木棍上。
    • 弹栈表示取出了栈顶的碗。
  3. 边界处理

    • a 中所有取碗编号必须是 1 到 n 的排列。
    • 如果 a 包含非法编号或重复编号,需提前检查。