Python-算法编程100例-系统设计题(入门级)-疫情人员管理

2024-06-15 19:36

本文主要是介绍Python-算法编程100例-系统设计题(入门级)-疫情人员管理,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

题目描述:

现有一套用于管理疫情下人员流动风险的软件系统,请实现以下接口:

RiskMonitor(int[] people):系统初始化,people[i]的下标表示人员编号,值表示所在地区的编号。初始时所有地区(包括没人的地区)都为低风险,系统初始为第0天。

travel(int date, int peopleid, int regionid): 在第date天时,人员peopleid前往目的地regionid旅行。

a. 如果该人员已经在该地区regionid,则停留在原地,并返回1;

b. 如果该人员已经被隔离,或者目的地此时为高风险,则停留在原地,返回-1;

c. 否则旅行成功,该人员从date天(含)开始位于新地区,返回0。

increaseRisk(int date, int regionid): 第date天(含)时,地区regionid变成高风险。当前该地区人员立即被隔离。

decreaseRisk(int date, int regionid):在第date天(含)时,地区regionid变成低风险。

a. 如果该地区从date开始连续14天处于低风险,则第date+14天(含),所有该地区的被隔离人员立即解除隔离。

query(int date): 在第date天(含)时,按人员编号升序,依次返回每个人累计被隔离的天数。

输出保证:

a. 所有接口调用按照date非严格递增顺序

b. 同一天中,increaseRisk或者decreaseRisk调用排在所有travel调用之前,query调用排在所有其他调用之后

c. 同一天同一地区调用increaseRisk和decreaseRisk的次数之和不会超过一次(即风险不会来回切换)

d. 调用increaseRisk或decreaseRisk一定会产生风险切换(比如不会出现已经高风险地区再调用increaseRisk的情况)

样例:

输入

RiskMonitor([1,1])

travel([2, 1, 0])

increaseRisk(5, 1)

query(5)

travel(19,1,1)

decreaseRisk(21, 1)

query(22)

travel(25, 1, 1)

travel(35, 0, 0)

query(37)

输出:

null

0

null

[1, 0]

-1

null

[18, 0]

0

0

[30, 0]

题目解答:

# 现有一套用于管理疫情下人员流动风险的软件系统,请实现以下接口:
# RiskMonitor(int[] people):系统初始化,people[i]的下标表示人员编号,值表示所在地区的编号。初始时所有地区(包括没人的地区)都为低风险,系统初始为第0天。
# travel(int date, int peopleid, int regionid): 在第date天时,人员peopleid前往目的地regionid旅行。
# a. 如果该人员已经在该地区regionid,则停留在原地,并返回1;
# b. 如果该人员已经被隔离,或者目的地此时为高风险,则停留在原地,返回-1;
# c. 否则旅行成功,该人员从date天(含)开始位于新地区,返回0。
# increaseRisk(int date, int regionid): 第date天(含)时,地区regionid变成高风险。当前该地区人员立即被隔离。
# decreaseRisk(int date, int regionid):在第date天(含)时,地区regionid变成低风险。
# a. 如果该地区从date开始连续14天处于低风险,则第date+14天(含),所有该地区的被隔离人员立即解除隔离。
# query(int date): 在第date天(含)时,按人员编号升序,依次返回每个人累计被隔离的天数。# 分析题意
# 对象(属性)
# # a. 如果该人员已经在该地区regionid,则停留在原地,并返回1;
# # b. 如果该人员已经被隔离,或者目的地此时为高风险,则停留在原地,返回-1;
# -->因此人员需要所在地区属性, 是否被隔离属性; 地区需要风险等级属性;
# people(编号, 所在区域, 是否被隔离)
# region(编号, 风险等级)# 地区变成高风险,该地区所有人员立即被隔离
# 地区变成低风险,从date开始连续14天处于低风险,该地区所有隔离人员解除隔离
# -->因此地区需要有人员属性
# region(编号, 风险等级, 地区所有人员)  -->数据结构 regin_dict = {region_id: {"level": level, "peoples": [peoples]}}# query(int date): 在第date天(含)时,按人员编号升序,依次返回每个人累计被隔离的天数。
# -->因此人员需要被隔离天数属性
# people(编号, 所在区域, 是否被隔离, 上次隔离天数, 隔离开始时间, 隔离结束时间)  --->数据结构 people_dict = {people_id: {
# "region_id": region, "status": status, "total_days": total_days, "start_day": start_day, "end_day": end_day}}from typing import List
from collections import defaultdictclass RiskMonitor:def __init__(self, people: List[int]):# 保存每个区域的人员self.region_dict = defaultdict(list)# 保存每个区域的风险等级self.region_staus = defaultdict(int)# 保存每个人的状态self.people_dict = defaultdict(dict)# 初始化for people_id, region_id in enumerate(people):self.region_dict[region_id].append(people_id)self.region_staus[region_id] = 0self.people_dict[people_id] = {"region_id": region_id, "status": 0, "total_days": 0, "start_day": 0, "end_day": 0}print("null")def update_people(self, date):for people_status in self.people_dict.values():# 隔离的人状态需要更新if people_status["status"] == 1:if people_status["end_day"] > 0 and date > people_status["end_day"]:total_days = people_status["total_days"] + people_status["end_day"] - people_status["start_day"] + 1people_status["total_days"] = total_dayspeople_status["status"] = 0people_status["start_day"] = 0people_status["end_day"] = 0else:total_days = people_status["total_days"] + date - people_status["start_day"] + 1people_status["total_days"] = total_dayspeople_status["start_day"] = date + 1def travel(self, date: int, people_id: int, region_id: int) -> int:# 更新一下状态self.update_people(date)# 如果该人员已经在该地区regionid,则停留在原地,并返回1if self.people_dict[people_id]["region_id"] == region_id:print(1)return 1# 如果该人员已经被隔离,或者目的地此时为高风险,则停留在原地,返回 - 1if self.people_dict[people_id]["status"] == 1 or self.region_staus[region_id] == 1:print(-1)return -1# 否则旅行成功,该人员从date天(含)开始位于新地区,返回0# 从旧区域中移除该人员self.region_dict[self.people_dict[people_id]["region_id"]].remove(people_id)# 更新该人员所在区域为新区域self.people_dict[people_id]["region_id"] = region_id# 在新区域中人员列表中增加该人员self.region_dict[region_id].append(people_id)print(0)return 0def increase_risk(self, date: int, region_id: int) -> int:# 第date天(含)时,地区regionid变成高风险。当前该地区人员立即被隔离self.update_people(date-1)self.region_staus[region_id] = 1for people_id in self.region_dict[region_id]:self.people_dict[people_id]["status"] = 1self.people_dict[people_id]["start_day"] = dateself.people_dict[people_id]["end_day"] = 0print("null")def decrease_risk(self, date: int, region_id: int) -> int:# 在第date天(含)时,地区regionid变成低风险# a. 如果该地区从date开始连续14天处于低风险,则第date+14天(含),所有该地区的被隔离人员立即解除隔离。self.region_staus[region_id] = 0for people_id in self.region_dict[region_id]:self.people_dict[people_id]["end_day"] = date + 13# 更新当天的状态self.update_people(date)print("null")def query(self, date: int) -> List[int]:# 更新一下当天状态self.update_people(date)query_list = []for value in self.people_dict.values():query_list.append(value["total_days"])print(query_list)return query_list

总结:

1、根据题目描述列出对象及其属性,有些属性根据题目描述就可以得到, 有些属性需要根据题目内容和实际要求解的结果自定义。

2、根据对象及其属性选择合适的数据结构,例如字典套字典,字典套列表等。

3、各个对象之前存在某种关联关系。

对象1(属性1,属性2...)

对象2(属性2, 属性2, 属性3...)

对象3(属性1...)

这篇关于Python-算法编程100例-系统设计题(入门级)-疫情人员管理的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1064375

相关文章

一文教你使用Python实现本地分页

《一文教你使用Python实现本地分页》这篇文章主要为大家详细介绍了Python如何实现本地分页的算法,主要针对二级数据结构,文中的示例代码简洁易懂,有需要的小伙伴可以了解下... 在项目开发的过程中,遇到分页的第一页就展示大量的数据,导致前端列表加载展示的速度慢,所以需要在本地加入分页处理,把所有数据先放

树莓派启动python的实现方法

《树莓派启动python的实现方法》本文主要介绍了树莓派启动python的实现方法,文中通过图文介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧... 目录一、RASPBerry系统设置二、使用sandroidsh连接上开发板Raspberry Pi三、运

CentOS系统Maven安装教程分享

《CentOS系统Maven安装教程分享》本文介绍了如何在CentOS系统中安装Maven,并提供了一个简单的实际应用案例,安装Maven需要先安装Java和设置环境变量,Maven可以自动管理项目的... 目录准备工作下载并安装Maven常见问题及解决方法实际应用案例总结Maven是一个流行的项目管理工具

Python给Excel写入数据的四种方法小结

《Python给Excel写入数据的四种方法小结》本文主要介绍了Python给Excel写入数据的四种方法小结,包含openpyxl库、xlsxwriter库、pandas库和win32com库,具有... 目录1. 使用 openpyxl 库2. 使用 xlsxwriter 库3. 使用 pandas 库

python实现简易SSL的项目实践

《python实现简易SSL的项目实践》本文主要介绍了python实现简易SSL的项目实践,包括CA.py、server.py和client.py三个模块,文中通过示例代码介绍的非常详细,对大家的学习... 目录运行环境运行前准备程序实现与流程说明运行截图代码CA.pyclient.pyserver.py参

使用Python实现批量分割PDF文件

《使用Python实现批量分割PDF文件》这篇文章主要为大家详细介绍了如何使用Python进行批量分割PDF文件功能,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录一、架构设计二、代码实现三、批量分割PDF文件四、总结本文将介绍如何使用python进js行批量分割PDF文件的方法

Python实现多路视频多窗口播放功能

《Python实现多路视频多窗口播放功能》这篇文章主要为大家详细介绍了Python实现多路视频多窗口播放功能的相关知识,文中的示例代码讲解详细,有需要的小伙伴可以跟随小编一起学习一下... 目录一、python实现多路视频播放功能二、代码实现三、打包代码实现总结一、python实现多路视频播放功能服务端开

使用Python在Excel中创建和取消数据分组

《使用Python在Excel中创建和取消数据分组》Excel中的分组是一种通过添加层级结构将相邻行或列组织在一起的功能,当分组完成后,用户可以通过折叠或展开数据组来简化数据视图,这篇博客将介绍如何使... 目录引言使用工具python在Excel中创建行和列分组Python在Excel中创建嵌套分组Pyt

Python实现视频转换为音频的方法详解

《Python实现视频转换为音频的方法详解》这篇文章主要为大家详细Python如何将视频转换为音频并将音频文件保存到特定文件夹下,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录1. python需求的任务2. Python代码的实现3. 代码修改的位置4. 运行结果5. 注意事项

Python利用自带模块实现屏幕像素高效操作

《Python利用自带模块实现屏幕像素高效操作》这篇文章主要为大家详细介绍了Python如何利用自带模块实现屏幕像素高效操作,文中的示例代码讲解详,感兴趣的小伙伴可以跟随小编一起学习一下... 目录1、获取屏幕放缩比例2、获取屏幕指定坐标处像素颜色3、一个简单的使用案例4、总结1、获取屏幕放缩比例from