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

相关文章

用Microsoft.Extensions.Hosting 管理WPF项目.

首先引入必要的包: <ItemGroup><PackageReference Include="CommunityToolkit.Mvvm" Version="8.2.2" /><PackageReference Include="Microsoft.Extensions.Hosting" Version="8.0.0" /><PackageReference Include="Serilog

零基础STM32单片机编程入门(一)初识STM32单片机

文章目录 一.概要二.单片机型号命名规则三.STM32F103系统架构四.STM32F103C8T6单片机启动流程五.STM32F103C8T6单片机主要外设资源六.编程过程中芯片数据手册的作用1.单片机外设资源情况2.STM32单片机内部框图3.STM32单片机管脚图4.STM32单片机每个管脚可配功能5.单片机功耗数据6.FALSH编程时间,擦写次数7.I/O高低电平电压表格8.外设接口

16.Spring前世今生与Spring编程思想

1.1.课程目标 1、通过对本章内容的学习,可以掌握Spring的基本架构及各子模块之间的依赖关系。 2、 了解Spring的发展历史,启发思维。 3、 对 Spring形成一个整体的认识,为之后的深入学习做铺垫。 4、 通过对本章内容的学习,可以了解Spring版本升级的规律,从而应用到自己的系统升级版本命名。 5、Spring编程思想总结。 1.2.内容定位 Spring使用经验

在线装修管理系统的设计

管理员账户功能包括:系统首页,个人中心,管理员管理,装修队管理,用户管理,装修管理,基础数据管理,论坛管理 前台账户功能包括:系统首页,个人中心,公告信息,论坛,装修,装修队 开发系统:Windows 架构模式:B/S JDK版本:Java JDK1.8 开发工具:IDEA(推荐) 数据库版本: mysql5.7 数据库可视化工具: navicat 服务器:SpringBoot自带 ap

Python 字符串占位

在Python中,可以使用字符串的格式化方法来实现字符串的占位。常见的方法有百分号操作符 % 以及 str.format() 方法 百分号操作符 % name = "张三"age = 20message = "我叫%s,今年%d岁。" % (name, age)print(message) # 我叫张三,今年20岁。 str.format() 方法 name = "张三"age

通信系统网络架构_2.广域网网络架构

1.概述          通俗来讲,广域网是将分布于相比局域网络更广区域的计算机设备联接起来的网络。广域网由通信子网于资源子网组成。通信子网可以利用公用分组交换网、卫星通信网和无线分组交换网构建,将分布在不同地区的局域网或计算机系统互连起来,实现资源子网的共享。 2.网络组成          广域网属于多级网络,通常由骨干网、分布网、接入网组成。在网络规模较小时,可仅由骨干网和接入网组成

关于如何更好管理好数据库的一点思考

本文尝试从数据库设计理论、ER图简介、性能优化、避免过度设计及权限管理方面进行思考阐述。 一、数据库范式 以下通过详细的示例说明数据库范式的概念,将逐步规范化一个例子,逐级说明每个范式的要求和变换过程。 示例:学生课程登记系统 初始表格如下: 学生ID学生姓名课程ID课程名称教师教师办公室1张三101数学王老师101室2李四102英语李老师102室3王五101数学王老师101室4赵六103物理陈

DDei在线设计器-API-DDeiSheet

DDeiSheet   DDeiSheet是代表一个页签,一个页签含有一个DDeiStage用于显示图形。   DDeiSheet实例包含了一个页签的所有数据,在获取后可以通过它访问其他内容。DDeiFile中的sheets属性记录了当前文件的页签列表。   一个DDeiFile实例至少包含一个DDeiSheet实例。   本篇最后提供的示例可以在DDei文档直接预览 属性 属性名说明数

代码随想录算法训练营:12/60

非科班学习算法day12 | LeetCode150:逆波兰表达式 ,Leetcode239: 滑动窗口最大值  目录 介绍 一、基础概念补充: 1.c++字符串转为数字 1. std::stoi, std::stol, std::stoll, std::stoul, std::stoull(最常用) 2. std::stringstream 3. std::atoi, std

springboot家政服务管理平台 LW +PPT+源码+讲解

3系统的可行性研究及需求分析 3.1可行性研究 3.1.1技术可行性分析 经过大学四年的学习,已经掌握了JAVA、Mysql数据库等方面的编程技巧和方法,对于这些技术该有的软硬件配置也是齐全的,能够满足开发的需要。 本家政服务管理平台采用的是Mysql作为数据库,可以绝对地保证用户数据的安全;可以与Mysql数据库进行无缝连接。 所以,家政服务管理平台在技术上是可以实施的。 3.1