📜  门| GATE MOCK 2017 |第53章(1)

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

门 | GATE MOCK 2017 |第53章

简介

本次GATE MOCK 2017 |第53章 是一道关于门的编程题目。该题目考察了程序员对数据结构和算法的掌握能力,以及对思维逻辑问题的解决能力。

在这个题目中,程序员需要设计一种数据结构来模拟门的开闭状态。门可以是开着的、关着的、或半开半闭的。程序员需要能够查询门的状态,并能够打开或关闭门。同时,程序员需要记录门的开闭历史,以便进行统计和分析。

要求

实现一个门类,要求包括以下功能:

  • 查询门的状态
  • 打开门
  • 关闭门
  • 记录门的开闭历史

门的状态可以是以下三种:

  • 开着的
  • 关着的
  • 半开半闭的

开闭历史应该记录每一次开门或关门的时间和状态,并可以输出统计信息,如门开启的总时间和门关闭的总时间等。

门的状态可以通过以下函数进行查询和设置:

class Gate:
    def is_closed(self) -> bool:
        pass
        
    def is_open(self) -> bool:
        pass
        
    def is_half_open(self) -> bool:
        pass
        
    def open(self) -> None:
        pass
        
    def close(self) -> None:
        pass

门的开闭历史可以通过以下函数进行记录和查询:

class Gate:
    def get_history(self) -> List[Tuple[datetime, str]]:
        pass
        
    def get_total_open_time(self) -> int:
        pass
        
    def get_total_close_time(self) -> int:
        pass
解法

为了实现以上功能,我们可以用一个布尔值来表示门的状态,即开或关。同时,我们可以用另一个布尔值来表示门是否处于半开半闭状态。

门的每一次开闭操作将记录下来,并存放在一个列表中。每次开门或关门时记录时间戳,并且记录门的状态,以便于后续进行分析。

代码
import datetime
from typing import List, Tuple

class Gate:
    def __init__(self):
        self.is_open_status = False
        self.is_half_open_status = False
        self.history_list = []

    def __str__(self):
        return "Gate is Open" if self.is_open_status else "Gate is Closed"

    def is_closed(self) -> bool:
        return not self.is_open_status and not self.is_half_open_status

    def is_open(self) -> bool:
        return self.is_open_status and not self.is_half_open_status

    def is_half_open(self) -> bool:
        return self.is_half_open_status

    def open(self) -> None:
        if not self.is_open_status:
            self.history_list.append((datetime.datetime.now(), "Open"))
        self.is_open_status = True
        self.is_half_open_status = False

    def close(self) -> None:
        if self.is_open_status or self.is_half_open_status:
            self.history_list.append((datetime.datetime.now(), "Close"))
        self.is_open_status = False
        self.is_half_open_status = False

    def get_history(self) -> List[Tuple[datetime.datetime, str]]:
        return self.history_list

    def get_total_open_time(self) -> int:
        open_time = 0
        close_time = 0
        history = self.get_history()

        for i in range(len(history)):
            if i % 2 == 0:
                close_time += (history[i + 1][0] - history[i][0]).total_seconds()
            else:
                open_time += (history[i + 1][0] - history[i][0]).total_seconds()

        if self.is_open_status:
            open_time += (datetime.datetime.now() - history[-1][0]).total_seconds()

        return int(open_time)

    def get_total_close_time(self) -> int:
        open_time = 0
        close_time = 0
        history = self.get_history()

        for i in range(len(history)):
            if i % 2 == 0:
                close_time += (history[i + 1][0] - history[i][0]).total_seconds()
            else:
                open_time += (history[i + 1][0] - history[i][0]).total_seconds()

        if self.is_closed():
            close_time += (datetime.datetime.now() - history[-1][0]).total_seconds()

        return int(close_time)
总结

门 | GATE MOCK 2017 |第53章 是一道优秀的编程题目,它不仅考察了程序员的数据结构和算法能力,还考察了程序员的思维逻辑能力。通过这个题目的练习,程序员可以提升自己的编程水平和解决问题的能力,更好地提升自己在职场上的竞争力。