📜  门| GATE CS 2019 |问题2(1)

📅  最后修改于: 2023-12-03 15:42:12.279000             🧑  作者: Mango

门 | GATE CS 2019 | 问题2

这是GATE计算机科学考试2019年的第2个问题,要求考生解决实现一个特定数据结构的问题。下面介绍具体内容。

问题描述

设计并实现一个数据结构 $CardDeck$,满足以下操作:

  1. $CardDeck(n)$:创建一个有 $n$ 张卡片的牌组,每张卡片的编号是 $0$ 到 $n-1$。
  2. $\text{shuffle}()$:将牌组洗牌,使得牌组随机重排。
  3. $\text{draw}()$:从牌组中拿出一张卡片并返回其编号。
  4. $\text{top}()$:返回当前牌组的最上层卡片的编号,但不将其弹出牌组。

需要实现的 $CardDeck$ 数据结构应该满足如下复杂度要求:

  • 调用 $\text{CardDeck}$ 函数的时间复杂度 $O(1)$。
  • 调用 $\text{shuffle}$ 函数的时间复杂度 $O(n)$。
  • 调用 $\text{draw}$ 函数的时间复杂度 $O(1)$。
  • 调用 $\text{top}$ 函数的时间复杂度 $O(1)$。
  • 空间复杂度 $O(n)$。
解题思路

可以使用一个数组保存牌组中每张卡片的编号,$shuffle$ 操作就是随机交换数组中的元素;$draw$ 操作就是从数组最后一个位置取出元素并更新数组的大小;$top$ 操作就是返回数组的最后一个元素即可。

具体实现代码如下:

import random

class CardDeck:
    def __init__(self, n):
        self.deck = list(range(n))

    def shuffle(self):
        random.shuffle(self.deck)

    def draw(self):
        return self.deck.pop()

    def top(self):
        return self.deck[-1]
总结

本题考察了考生对数据结构的理解和操作能力,需要考生具备一定的编程能力和算法基础。