一、题目解析
题目描述
小F在玩一个套碗游戏,碗从 1 到 n 编号,从大到小依次套在木棍上。每次只能取最上面的碗,需判断给定取碗顺序是否可行。
规则总结
- 碗只能从最上方依次取出。
- 若取碗顺序无法通过合法操作完成,返回 0;否则返回 1。
目标
给定碗数 n 和取碗顺序 a,判断是否可行。
二、解题思路
本题可以使用 栈(Stack) 来模拟碗的取出过程,检查是否能通过栈的操作完成给定的取碗顺序。
-
栈模拟的核心思想
- 从编号为 1 到 n,依次将碗压入栈中。
- 每次检查栈顶是否是当前需要取出的碗,若是则弹出栈顶;否则继续压入下一个碗。
-
算法流程
-
初始化一个空栈 stack 和索引 index=0,表示当前需要取出的碗序号。
-
遍历从 1 到 n 的所有碗编号 i:
-
将 i 压入栈。
-
检查栈顶是否是当前需要取出的碗a[index]:
- 如果是,则弹出栈顶并更新 index。
-
-
遍历结束后,如果栈清空且所有碗按顺序取出,则取碗顺序合法。
-
-
返回结果
- 如果碗的顺序能通过上述模拟完成,返回 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,合法
四、知识总结
-
栈的应用
栈是一种后进先出的数据结构,非常适合模拟这种取碗顺序问题。 -
模拟思路
- 压栈表示碗依次被放到木棍上。
- 弹栈表示取出了栈顶的碗。
-
边界处理
- a 中所有取碗编号必须是 1 到 n 的排列。
- 如果 a 包含非法编号或重复编号,需提前检查。