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

118 阅读2分钟

问题分析

  1. 小N要从一组堆叠好的碗中按指定顺序取出碗。
  2. 碗从1到M按顺序堆叠,最底层是1,最上层是M。
  3. 每次只能从堆顶取碗。
  4. 给定的序列表示取碗的顺序,我们要判断这个取碗顺序是否可能。

解决思路

  1. 使用一个栈来模拟取碗过程。

  2. 初始化当前需要取的碗号为1,即从最底层的1开始。

  3. 遍历给定的取碗顺序列表 a

    • 如果当前需要的碗号与取碗顺序列表中的碗号相同,则说明可以取该碗。
    • 如果当前碗号小于目标碗号,则依次将碗号压入栈中,直到找到目标碗号为止。
    • 如果栈顶的碗号与目标碗号不符,且无法通过其他操作实现,则返回0。
  4. 如果遍历结束且取碗顺序可行,则返回1。

    stack = []  # 用来模拟取碗的过程
    current_bowl = 1  # 从碗1开始
    for bowl in a:
        # 如果当前碗号小于目标碗号,依次压入栈
        while current_bowl <= M and (not stack or stack[-1] != bowl):
            stack.append(current_bowl)
            current_bowl += 1
        # 如果栈顶元素是目标碗号,取出该碗
        if stack and stack[-1] == bowl:
            stack.pop()
        else:
            return 0
    return 1

# 测试样例
print(is_valid_sequence(2, [1, 2]))  # 输出:1
print(is_valid_sequence(3, [3, 1, 2]))  # 输出:0
print(is_valid_sequence(4, [1, 3, 2, 4]))  # 输出:1

代码解释

1.初始化代码stack为空,用于模拟堆栈

2.用current_bow1表示当前要压入栈的碗号,从1开始

3.遍历a中的每个目标碗号:

  • 如果current_bow1小于目标碗号,依次将碗号压入栈,直到目标碗号出现在栈顶。
  • 如果栈顶元素等于目标碗号,则取出栈顶元素
  • 如果栈顶元素不等于目标碗号,则返回0

4.如果遍历结束时所有碗都能按顺序取出,返回1

写这个代码时,感觉最有趣的地方在于如何利用栈来模拟实际取碗的过程,通过将需要的碗压入栈,然后检查栈顶是否符合当前的取碗顺序,这种解决办法,即简单又明了的解决了这个问题,这种办法也很高效,不用过多的遍历,就能让整个过程都易于理解和实现,