每日一题——Python代码实现PAT甲级1006 Sign In and Sign Out(举一反三+思想解读+逐步优化)五千字好文

news2024/12/22 11:18:18


一个认为一切根源都是“自己不够强”的INTJ

个人主页:用哲学编程-CSDN博客
专栏:每日一题——举一反三
Python编程学习
Python内置函数

Python-3.12.0文档解读

目录

我的写法

代码点评

时间复杂度分析

空间复杂度分析

我要更强

优化建议

优化后的代码

时间复杂度和空间复杂度分析

优化说明

哲学和编程思想

抽象化(Abstraction):

模块化(Modularity):

效率优化(Efficiency Optimization):

数据驱动(Data-Driven):

迭代与增量开发(Iterative and Incremental Development):

算法和数据结构的选择(Algorithm and Data Structure Selection):

KISS原则(Keep It Simple, Stupid):

DRY原则(Don't Repeat Yourself):

单一职责原则(Single Responsibility Principle):

测试驱动开发(Test-Driven Development):

举一反三


题目链接:https://pintia.cn/problem-sets/994805342720868352/exam/problems/type/7?problemSetProblemId=994805516654460928&page=0

我的写法

# 读取输入的M,表示接下来会有M行输入数据
M = int(input())

# 初始化变量,用于记录解锁和锁定的人以及对应的时间
who_unlocked = ''
who_locked = ''
time_unlocked = 235959  # 初始化为最大可能的时间(23:59:59)
time_locked = 0  # 初始化为最小可能的时间(00:00:00)

# 循环M次,每次处理一行输入数据
for i in range(M):
    # 读取一行输入,分割成三个部分:id_num(人员编号),in_time(进入时间),out_time(离开时间)
    id_num, in_time, out_time = input().split()
    
    # 将时间字符串转换为整数,去掉冒号,方便比较
    in_time = int(in_time.replace(':', ''))
    out_time = int(out_time.replace(':', ''))
    
    # 如果当前记录的进入时间早于已知的最早进入时间,则更新最早进入时间和对应的人员编号
    if in_time < time_unlocked:
        time_unlocked = in_time
        who_unlocked = id_num
    
    # 如果当前记录的离开时间晚于已知的最晚离开时间,则更新最晚离开时间和对应的人员编号
    if time_locked < out_time:
        time_locked = out_time
        who_locked = id_num

# 输出最早进入和最晚离开的人员编号
print(f"{who_unlocked} {who_locked}")

代码点评

这段代码实现了从用户输入中读取一系列人员的进出记录,并找出最早进入和最晚离开的人员编号。以下是对代码的专业点评:

  1. 输入处理:代码通过input()函数读取用户输入,并使用split()方法分割输入数据,这使得代码具有良好的交互性和灵活性。
  2. 时间处理:将时间字符串转换为整数,以便于比较。这种转换简化了时间比较的逻辑,但需要注意时间格式的统一性,确保所有时间都能正确转换。
  3. 逻辑清晰:代码通过两个变量time_unlocked和time_locked分别记录最早进入和最晚离开的时间,逻辑清晰,易于理解。
  4. 变量初始化:time_unlocked初始化为最大可能的时间,time_locked初始化为最小可能的时间,这是合理的初始化策略,确保在第一次比较时能够正确更新。
  5. 输出格式:使用格式化字符串f"{who_unlocked} {who_locked}"输出结果,简洁明了。

时间复杂度分析

  • 读取输入:每次读取一行输入,时间复杂度为O(M),其中M是输入的行数。
  • 字符串处理:每次处理一行输入中的时间字符串,时间复杂度为O(1),因为每次操作都是固定的。
  • 循环:外层循环执行M次,每次循环内部的时间复杂度为O(1),因此总的时间复杂度为O(M)。

综上,这段代码的时间复杂度为O(M)。

空间复杂度分析

  • 存储输入:每次循环中,存储三个变量(id_num, in_time, out_time),空间复杂度为O(1)。
  • 存储结果:存储两个时间变量和两个人员编号变量,空间复杂度为O(1)。

由于空间复杂度不随输入规模M的增加而增加,因此这段代码的空间复杂度为O(1)。

总结,这段代码在时间和空间效率上都表现良好,逻辑清晰,适合处理此类问题。


我要更强

优化建议

  1. 输入优化:可以一次性读取所有输入,然后进行处理,这样可以减少每次读取输入的开销。
  2. 时间处理优化:可以使用更高效的数据结构(如字典)来存储人员和时间的关系,这样可以快速查找和更新。
  3. 逻辑优化:可以合并判断条件,减少不必要的比较。

优化后的代码

# 一次性读取所有输入,并分割成列表
all_inputs = [input().split() for _ in range(int(input()))]

# 初始化字典,用于存储每个人员的最早进入时间和最晚离开时间
person_times = {}

# 处理输入数据
for id_num, in_time_str, out_time_str in all_inputs:
    # 将时间字符串转换为整数
    in_time = int(in_time_str.replace(':', ''))
    out_time = int(out_time_str.replace(':', ''))
    
    # 如果人员编号不在字典中,初始化其时间记录
    if id_num not in person_times:
        person_times[id_num] = {'in_time': in_time, 'out_time': out_time}
    else:
        # 更新最早进入时间和最晚离开时间
        person_times[id_num]['in_time'] = min(person_times[id_num]['in_time'], in_time)
        person_times[id_num]['out_time'] = max(person_times[id_num]['out_time'], out_time)

# 找出最早进入和最晚离开的人员编号
earliest_in = min(person_times, key=lambda x: person_times[x]['in_time'])
latest_out = max(person_times, key=lambda x: person_times[x]['out_time'])

# 输出结果
print(f"{earliest_in} {latest_out}")

时间复杂度和空间复杂度分析

  • 时间复杂度:读取所有输入的时间复杂度为O(M),处理输入的时间复杂度为O(M),查找最早进入和最晚离开的时间复杂度为O(M)。因此,总的时间复杂度为O(M)。
  • 空间复杂度:存储所有人员的时间记录,空间复杂度为O(M),其中M是输入的行数。

优化说明

  1. 输入优化:通过列表推导一次性读取所有输入,减少了多次调用input()的开销。
  2. 时间处理优化:使用字典存储每个人员的最早进入时间和最晚离开时间,可以快速查找和更新。
  3. 逻辑优化:通过字典的键值对存储,简化了更新逻辑,减少了不必要的比较。

这种优化方法在处理大量数据时更为高效,特别是在输入数据量较大时,能够显著提升性能。


哲学和编程思想

优化代码的过程中融入了多种哲学和编程思想,以下是一些主要的思想:

  1. 抽象化(Abstraction):

    • 通过使用字典来存储人员和时间的关系,抽象化了数据的存储和访问方式,使得代码更加简洁和易于理解。
  2. 模块化(Modularity):

    • 代码中的每个功能(如输入处理、时间转换、结果输出)都被模块化为独立的步骤,这有助于代码的维护和测试。
  3. 效率优化(Efficiency Optimization):

    • 通过一次性读取所有输入和使用字典来存储数据,减少了重复的输入操作和提高了数据访问的速度,体现了对程序运行效率的追求。
  4. 数据驱动(Data-Driven):

    • 代码的逻辑主要围绕数据处理展开,通过分析和操作数据来解决问题,这是数据驱动编程的体现。
  5. 迭代与增量开发(Iterative and Incremental Development):

    • 优化过程可以看作是一个迭代和增量的过程,每次优化都基于前一次的结果,逐步改进代码的性能和可读性。
  6. 算法和数据结构的选择(Algorithm and Data Structure Selection):

    • 选择合适的数据结构(如字典)来存储和操作数据,这是算法设计中的关键步骤,直接影响程序的效率。
  7. KISS原则(Keep It Simple, Stupid):

    • 代码优化过程中尽量保持简单,避免过度复杂化,这有助于提高代码的可读性和可维护性。
  8. DRY原则(Don't Repeat Yourself):

    • 通过抽象和模块化,避免了代码的重复,这是DRY原则的体现,有助于减少错误和提高代码质量。
  9. 单一职责原则(Single Responsibility Principle):

    • 每个函数或模块只负责一个功能,这有助于保持代码的清晰和易于维护。
  10. 测试驱动开发(Test-Driven Development):

  • 虽然代码中没有直接体现,但在实际开发中,优化后的代码应该通过测试来验证其正确性和性能,这是测试驱动开发的思想。

这些哲学和编程思想在优化代码的过程中相互交织,共同指导着代码的改进和优化。通过应用这些思想,可以提高代码的质量、效率和可维护性。


举一反三

掌握这些哲学和编程思想后,可以将它们应用到更广泛的编程场景中,以下是一些技巧和建议,帮助举一反三:

  1. 抽象化与模块化:
    • 在设计程序时,尝试将复杂的问题分解为更小的、可管理的部分。每个部分应该负责一个明确的功能,并且可以独立测试和维护。
    • 使用类和对象来封装数据和操作,这样可以提高代码的可重用性和可维护性。
  2. 效率优化:
    • 分析代码中的瓶颈,通常是循环和数据处理部分。优化这些部分可以显著提高整体性能。
    • 使用合适的数据结构和算法来解决问题。例如,如果需要频繁查找,使用哈希表(如Python中的字典)通常比列表更高效。
  3. 数据驱动:
    • 当面对需要处理大量数据的问题时,考虑数据的特点和结构,设计适合的数据模型和处理流程。
    • 使用数据库或数据存储服务来管理数据,这样可以更有效地处理和查询数据。
  4. 迭代与增量开发:
    • 采用敏捷开发方法,将项目分解为多个小迭代,每个迭代都包含设计、编码、测试和反馈。
    • 在每个迭代中,专注于实现最重要的功能,然后逐步添加更多功能。
  5. 算法和数据结构的选择:
    • 学习和理解不同的算法和数据结构,了解它们的时间和空间复杂度,以及适用场景。
    • 在解决问题时,首先考虑是否存在已知的算法或数据结构可以应用。
  6. KISS原则:
    • 编写代码时,尽量保持简单明了,避免过度设计。
    • 使用清晰的命名和注释,确保代码易于理解和维护。
  7. DRY原则:
    • 避免在代码中重复相同的逻辑。如果发现重复,考虑将其抽象为一个函数或模块。
    • 使用配置文件或环境变量来管理重复的设置,而不是在代码中硬编码。
  8. 单一职责原则:
    • 确保每个函数、类或模块只做一件事,并且做好这件事。
    • 当一个组件变得过于复杂时,考虑将其分解为更小的组件。
  9. 测试驱动开发:
  • 在编写代码之前,先编写测试用例。这有助于确保代码的正确性,并且可以作为文档来指导代码的实现。
  • 定期运行测试,确保代码的稳定性和可靠性。

通过将这些哲学和编程思想应用到实际的编程实践中,可以提高代码的质量,减少错误,并且更有效地解决问题。记住,编程不仅仅是写代码,更是一种思维方式和解决问题的艺术。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1858103.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【总结】在SpringBoot项目中如何动态切换数据源、数据库?(可直接CV)

注意&#xff1a;文章若有错误的地方&#xff0c;欢迎评论区里面指正 &#x1f36d; 前言 本文参考若依源码&#xff0c;介绍了如何在SpringBoot项目中使用AOP和自定义注解实现MySQL主从数据库的动态切换&#xff0c;当从库故障时&#xff0c;能自动切换到主库&#xff0c;确…

国标GB28181视频汇聚平台EasyCVR设备展示数量和显示条数不符的原因排查与解决

国标GB28181/GA/T1400协议/安防综合管理系统EasyCVR视频汇聚平台能在复杂的网络环境中&#xff0c;将前端设备统一集中接入与汇聚管理。智慧安防/视频存储/视频监控/视频汇聚EasyCVR平台可以提供实时远程视频监控、视频录像、录像回放与存储、告警、语音对讲、云台控制、平台级…

API低代码平台介绍6-数据库记录删除功能

数据库记录删除功能 在前续文章中我们介绍了如何插入和修改数据库记录&#xff0c;本篇文章会沿用之前的测试数据&#xff0c;介绍如何使用ADI平台定义一个删除目标数据库记录的接口&#xff0c;包括 单主键单表删除、复合主键单表删除、多表删除&#xff08;整合前两者&#x…

aws的eks(k8s)ingress+elb部署实践

eks&#xff08;k8s&#xff09;版本1.29 ingress 版本1.10.0 负载均衡elb 1. 创建Ingress-Nginx服务 部署项目地址【点我跳转】推荐自定义部署 可绑定acm证书什么的自己属性 这里就是aws上面Certificate Manager产品上面创建证书 导入 创建都行 对应集群版本推荐阵列GitH…

YOLOv8 目标检测程序,依赖的库最少,使用onnxruntime推理

YOLOv8 目标检测程序&#xff0c;依赖的库最少&#xff0c;使用onnxruntime推理 flyfish 为了方便理解&#xff0c;加入了注释 """ YOLOv8 目标检测程序 Author: flyfish Date: Description: 该程序使用ONNX运行时进行YOLOv8模型的目标检测。它对输入图像进行…

尴尬时刻:如何在忘记名字时巧妙应对

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗&#xff1f;订阅我们的简报&#xff0c;深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同&#xff0c;从行业内部的深度分析和实用指南中受益。不要错过这个机会&#xff0c;成为AI领…

代理IP知识:导致代理IP访问超时的原因有哪些?

很多用户在使用代理IP进行网络访问时&#xff0c;可能会遇到代理IP超时的情况&#xff0c;也就是代理IP的延迟过高。代理IP延迟过高会影响用户的网络体验和数据获取效率。因此&#xff0c;了解代理IP延迟过高的原因很重要。以下是导致代理IP延迟过高的一些常见原因&#xff1a;…

美容美发店营销版微信小程序源码

打造线上生意新篇章 一、引言&#xff1a;微信小程序&#xff0c;开启美容美发行业新纪元 在数字化时代&#xff0c;微信小程序以其便捷、高效的特点&#xff0c;成为了美容美发行业营销的新宠。本文将带您深入了解美容美发营销微信小程序&#xff0c;探讨其独特优势及如何助…

盘点5款最热门的AI绘画软件!总有一款是你的菜

在数字化艺术日益盛行的今天&#xff0c;AI绘画软件成为了创作者们的新宠。这些软件不仅能够帮助艺术家们快速生成独特的艺术作品&#xff0c;还能为普通用户带来全新的绘画体验。今天&#xff0c;我们就来盘点五款最热门的AI绘画软件&#xff0c;看看哪一款是你的菜&#xff0…

深度学习 --- stanford cs231学习笔记五(训练神经网络的几个重要组成部分之三,权重矩阵的初始化)

权重矩阵的初始化 3&#xff0c;权重矩阵的初始化 深度学习所学习的重点就是要根据损失函数训练权重矩阵中的系数。即便如此&#xff0c;权重函数也不能为空&#xff0c;总是需要初始化为某个值。 3&#xff0c;1 全都初始化为同一个常数可以吗&#xff1f; 首先要简单回顾一下…

技术干货 | AI驱动工程仿真和设计创新

在当今快速发展的技术领域&#xff0c;人工智能&#xff08;AI&#xff09;、机器学习和深度学习等技术已经成为推动工程仿真和设计创新的关键力量。Altair技术经理张晨在Altair “AI FOR ENGINEERS”线下研讨会上发表了相关精彩演讲&#xff0c;本文摘自演讲内容&#xff0c;与…

数字化校园平台:引领教育创新的智慧之选

数字化校园平台是信息化技术与传统教育深度结合的产物。在当今这个信息技术日新月异的时代&#xff0c;数字化校园平台正逐渐崭露头角&#xff0c;成为教育领域一股不可小觑的革新力量。它如同一座桥梁&#xff0c;连接起教育资源的各个角落&#xff0c;将繁杂的教学材料、珍贵…

猫狗识别—视频识别

猫狗识别—视频识别 1. 导入所需的库&#xff1a;2. 创建Tkinter主窗口并设置标题&#xff1a;3. 设置窗口的宽度和高度&#xff1a;4. 创建一个Canvas&#xff0c;它将用于显示视频帧&#xff1a;5. 初始化一个视频流变量cap&#xff0c;用于存储OpenCV的视频捕获对象&#xf…

Matlab要这样批量读取txt数据!科研效率UpUp第10期

假如我们有多组txt格式的数据&#xff1a; 其数据格式是这样的&#xff1a; 想要批量读取这些数据&#xff0c;并把他们画在一张图上&#xff0c;该怎么操作呢&#xff1f; ​之前有分享load函数的版本&#xff0c;本期进一步分享适用性更强的readtable函数的实现方法​。 首…

工业的物联网在构建弹性供应链系统中的作用

物联网 (IoT) 可以显着提高供应链系统的效率&#xff0c;因为物联网处理设备之间的连接。简而言之&#xff0c;物联网转化为“连接设备”&#xff0c;物联网的这种能力导致了智能系统或环境。物联网将这些设备与传感器和执行器连接起来&#xff0c;这些传感器和执行器收集数据并…

【计算机网络仿真】b站湖科大教书匠思科Packet Tracer——实验8 IPv4地址 — 分类地址

一、实验目的 1.验证分类IP地址的作用&#xff1b; 2.初步了解路由器的功能。 二、实验要求 1.使用Cisco Packet Tracer仿真平台&#xff1b; 2.观看B站湖科大教书匠仿真实验视频&#xff0c;完成对应实验。 三、实验内容 1.构建网络拓扑&#xff1b; 2.修改网络拓扑&…

原创作品—工业软件界面设计作品

在工业4.0时代&#xff0c;界面设计不仅要追求美观&#xff0c;更要以用户体验为核心。通过简化操作流程、优化交互逻辑&#xff0c;降低用户的学习成本&#xff0c;提高使用效率。这样的设计能够为企业数字化转型提供有力支持&#xff0c;增强用户对产品的黏性。 数字化转型的…

云盘高速视觉检测机如何提升螺丝尺寸检测效率?

螺丝&#xff0c;一种用来连接和固定物体的金属件&#xff0c;通常是长有螺纹的金属棒。螺丝有不同种类和尺寸&#xff0c;常见的用途包括组装家具、机械设备和其他结构。连接和固定物体&#xff0c;通过螺丝的螺纹结构&#xff0c;将两个或多个物体牢固地连接在一起。提供调节…

LabVIEW与C#相互调用dll

C#调用LabVIEW创建的dll 我先讲LabVIEW创建自己的.net类库的方法吧&#xff0c;重点是创建&#xff0c;C#调用的步骤&#xff0c;大家可能都很熟悉了。 1、创建LabVIEW项目&#xff0c;并创建一个简单的add.vi&#xff0c;内容就是abc&#xff0c;各个接线端都正确连接就好。 …

一种改进解卷积算法在旋转机械故障诊断中的应用(MATLAB)

轴承振动是随机振动。在不同的时刻&#xff0c;轴承振动值是不尽相同的&#xff0c;不能用一个确定的时间函数来描述。这是由于滚动体除了有绕轴承公转运动以外&#xff0c;还有绕自身轴线的自旋运动&#xff0c;且在轴承运转时&#xff0c;滚动接触表面形貌是不断变化的&#…