每日一题——Python实现PAT乙级1026 程序运行时间(举一反三+思想解读+逐步优化)五千字好文


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

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

Python-3.12.0文档解读

目录

我的写法

代码结构和逻辑

时间复杂度

空间复杂度

代码优化建议

总结

我要更强

优化方法

优化后的代码示例

代码注释

时间复杂度和空间复杂度

进一步优化建议

哲学和编程思想

1. 抽象和封装

2. 简洁性

3. 避免重复

4. 函数式编程

5. 最小惊讶原则(Principle of Least Astonishment)

6. 错误处理和输入验证

7. 效率和优化

举一反三

1. 抽象和封装

2. 简洁性

3. 避免重复

4. 函数式编程

5. 最小惊讶原则

6. 错误处理和输入验证

7. 效率和优化

8. 代码审查

9. 持续学习和实践


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

我的写法

C1,C2=map(int,input().split())seconds=(C2-C1)//100
tmp=(C2-C1)%100
if tmp>=50:seconds+=1minutes=seconds//60
seconds%=60
hours=minutes//60
minutes%=60
seconds=str(seconds)
minutes=str(minutes)
hours=str(hours)
print(hours.zfill(2),minutes.zfill(2),seconds.zfill(2),sep=':')

这段代码的主要功能是将两个时间戳之间的差值转换为小时、分钟和秒的格式,并输出为标准时间格式(HH:MM:SS)。以下是对代码的专业点评:

代码结构和逻辑

  1. 输入处理:代码首先通过 map(int, input().split()) 读取两个整数 C1 和 C2,这两个值代表两个时间戳。
  2. 时间差计算:通过 (C2 - C1) // 100 计算出秒数,并使用 (C2 - C1) % 100 处理小数部分,确保秒数的精度。
  3. 时间单位转换:将总秒数转换为小时、分钟和秒,并使用 zfill(2) 方法确保每个时间单位都是两位数。
  4. 输出格式:最终输出格式为 HH:MM:SS,确保时间格式的一致性。

时间复杂度

  • 时间复杂度:O(1)。代码中的所有操作(输入、计算、格式化输出)都是常数时间操作,不随输入规模变化。

空间复杂度

  • 空间复杂度:O(1)。代码使用了固定数量的变量来存储中间结果和最终结果,没有使用额外的数据结构,因此空间复杂度是常数级的。

代码优化建议

  1. 变量命名:变量名 C1 和 C2 可以更具描述性,例如 timestamp1 和 timestamp2,以提高代码的可读性。
  2. 常量使用:可以使用常量来表示时间单位(如 100、60 等),以提高代码的可维护性。
  3. 异常处理:可以添加异常处理来确保输入的时间戳是有效的,避免潜在的运行时错误。

总结

这段代码简洁高效,逻辑清晰,能够正确地将时间戳差值转换为标准时间格式。时间复杂度和空间复杂度均为 O(1),适用于大多数场景。通过一些小的改进,可以进一步提升代码的可读性和健壮性。


我要更强

优化时间复杂度和空间复杂度通常涉及减少不必要的计算和内存使用。以下是一些优化方法,并附上相应的代码示例和注释。

优化方法

  1. 减少重复计算:避免在循环中重复计算相同的值。
  2. 使用内置函数:利用 Python 的内置函数来简化代码。
  3. 避免不必要的变量:减少中间变量的使用,直接计算最终结果。
  4. 使用生成器:对于大型数据集,使用生成器可以减少内存占用。

优化后的代码示例

def format_time_difference(timestamp1, timestamp2):# 计算时间差(以秒为单位)total_seconds = (timestamp2 - timestamp1) // 100milliseconds = (timestamp2 - timestamp1) % 100# 如果毫秒部分大于等于50,则向上取整if milliseconds >= 50:total_seconds += 1# 计算小时、分钟和秒hours, remainder = divmod(total_seconds, 3600)minutes, seconds = divmod(remainder, 60)# 格式化输出return f"{hours:02d}:{minutes:02d}:{seconds:02d}"# 读取输入
C1, C2 = map(int, input().split())# 输出结果
print(format_time_difference(C1, C2))

代码注释

  1. 函数封装:将时间差计算和格式化封装在一个函数中,提高代码的可读性和可维护性。
  2. 减少中间变量:直接在 divmod 函数中计算小时和剩余秒数,减少中间变量的使用。
  3. 格式化字符串:使用 f-string 格式化输出,简洁且高效。

时间复杂度和空间复杂度

  • 时间复杂度:O(1),所有操作都是常数时间。
  • 空间复杂度:O(1),只使用了固定数量的变量。

进一步优化建议

  1. 输入验证:可以添加输入验证,确保输入的时间戳是有效的。
  2. 错误处理:添加错误处理机制,例如处理负数时间戳的情况。

通过这些优化,代码变得更加简洁和高效,同时保持了良好的可读性和可维护性。


哲学和编程思想

这些优化方法体现了多种哲学和编程思想,具体包括:

1. 抽象和封装

哲学思想:抽象是哲学中的一个核心概念,它强调从具体事物中提取出普遍的、本质的特征。 编程思想:在代码中,将时间差计算和格式化封装在一个函数中,体现了抽象和封装的思想。这样做不仅提高了代码的可读性,还使得代码更易于维护和测试。

2. 简洁性

哲学思想:简洁性是哲学中追求真理的一种方式,强调去除不必要的复杂性。 编程思想:在代码中,使用 f-string 格式化输出,减少了冗余代码,使得代码更加简洁和高效。

3. 避免重复

哲学思想:避免重复是哲学中的一种原则,强调避免不必要的重复劳动。 编程思想:在代码中,通过使用 divmod 函数一次性计算小时和剩余秒数,避免了重复计算,提高了代码的效率。

4. 函数式编程

哲学思想:函数式编程强调将计算过程看作是数学函数的求值,避免状态和可变数据。 编程思想:在代码中,通过将时间差计算和格式化封装在一个纯函数中,体现了函数式编程的思想。这样做使得代码更加模块化,易于理解和测试。

5. 最小惊讶原则(Principle of Least Astonishment)

哲学思想:最小惊讶原则强调设计应符合用户的预期,避免用户感到惊讶。 编程思想:在代码中,通过使用常见的函数和操作符(如 divmod 和 f-string),使得代码的行为符合开发者的预期,减少了学习和使用成本。

6. 错误处理和输入验证

哲学思想:错误处理和输入验证是哲学中对现实世界复杂性的认识,强调对异常情况的处理。 编程思想:在代码中,虽然当前版本没有显式处理错误和输入验证,但这是进一步优化的方向。通过添加错误处理和输入验证,可以提高代码的健壮性和可靠性。

7. 效率和优化

哲学思想:效率和优化是哲学中对事物本质的追求,强调在有限资源下达到最佳效果。 编程思想:在代码中,通过减少中间变量和避免重复计算,提高了代码的执行效率和内存使用效率。

通过这些哲学和编程思想的结合,代码不仅变得更加高效和简洁,还提高了可读性和可维护性,符合软件工程的最佳实践。


举一反三

结合上述哲学和编程思想,以下是一些通用的技巧,可以帮助在编程时举一反三,提高代码质量和效率:

1. 抽象和封装

  • 定义函数:将复杂逻辑分解为多个小函数,每个函数只做一件事。
  • 模块化设计:将相关的功能封装在模块或类中,提高代码的复用性和可维护性。

2. 简洁性

  • 使用内置函数:充分利用 Python 的内置函数和标准库,减少自定义代码。
  • 避免冗余:删除不必要的代码和注释,保持代码简洁。

3. 避免重复

  • 使用循环和迭代:避免在代码中重复相同的逻辑,使用循环或列表推导式来处理重复任务。
  • 缓存计算结果:对于耗时的计算,使用缓存(如字典)来存储中间结果,避免重复计算。

4. 函数式编程

  • 使用纯函数:编写没有副作用的纯函数,使得代码更易于测试和推理。
  • 避免状态变化:尽量减少全局变量和可变状态的使用,使得代码更稳定。

5. 最小惊讶原则

  • 遵循惯例:使用常见的命名和代码结构,使得代码更易于理解和维护。
  • 文档和注释:编写清晰的文档和注释,帮助其他开发者理解代码意图。

6. 错误处理和输入验证

  • 异常处理:使用 try-except 块来捕获和处理异常,提高代码的健壮性。
  • 输入验证:在函数入口处验证输入参数,确保它们符合预期。

7. 效率和优化

  • 性能分析:使用性能分析工具(如 cProfile)来识别代码中的瓶颈。
  • 算法优化:选择合适的数据结构和算法,以提高代码的执行效率。

8. 代码审查

  • 同行评审:定期进行代码审查,从其他开发者的角度发现潜在问题和改进点。
  • 代码风格:遵循一致的代码风格(如 PEP 8),提高代码的可读性。

9. 持续学习和实践

  • 阅读优秀代码:阅读和学习开源项目或其他优秀代码,吸收其中的设计思想和技巧。
  • 实践和反思:在实际项目中应用这些技巧,并定期反思和总结经验。

通过结合这些技巧和哲学思想,可以在编程时更加灵活和高效,编写出高质量的代码。记住,编程是一个不断学习和改进的过程,持续实践和反思是提高编程能力的关键。


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

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

相关文章

交换机需要多大 buffer

有点违背直觉,但是真事儿,交换机过境的流越多,所需 buffer 越小,这是为什么? 范氏(范雅各布森,van jacobson)管道的 aimd 流建议 buffer_size 为 bdp,这很容易理解,因为 aimd 流最小…

币界网讯,预计以太坊现货 ETF 将于 7 月中旬推出

刚刚 ETF Store 总裁 Nate Geraci 在 X (前Twitter)平台上宣布,备受数字货币市场期待的SEC以太坊现货 ETF提案,将于7 月中旬通过美国证券交易委员会(SEC)批准。Nate Geraci透露修订后的 S-1 文件将于 7 月 …

pnpm的坑

请问pnpm的两个坑怎么解决: 第一个坑:没有节省磁盘空间 我已经配置了依赖的存储位置, 但我在项目里pnpm install以后,发现依赖包还是很大, 然后发现里面的链接并不是指向先前配置的依赖存储位置,而是指…

【数智化人物展】袋鼠云CEO宁海元:大模型时代,Data+AI将成为新的基础设施

宁海元 本文由袋鼠云CEO宁海元投递并参与由数据猿联合上海大数据联盟共同推出的《2024中国数智化转型升级先锋人物》榜单/奖项评选。 大数据产业创新服务媒体 ——聚焦数据 改变商业 身处这个瞬息万变的数字经济时代,传统的生产模式往往依赖于经验和固定的流程&…

k8s-第六节-数据持久化

数据持久化 kubernetes 集群不会为你处理数据的存储,需要为数据库挂载一个磁盘来确保数据的安全。 可以选择云存储、本地磁盘、NFS。 本地磁盘:可以挂载某个节点上的目录,但是这需要限定 pod 在这个节点上运行 云存储:不限定节…

GEE计算遥感生态指数RESI

目录 RESI湿度绿度热度干度源代码归一化函数代码解释整体的代码功能解释:导出RSEI计算结果参考文献RESI RSEI = f (Greenness,Wetness,Heat,Dryness)其遥感定义为: RSEI = f (VI,Wet,LST,SI)式中:Greenness 为绿度;Wetness 为湿度;Thermal为热度;Dryness 为干度;VI 为植被指数…

手写starter核心思路流程-全网最详细版本

全网最详细手写starter组件教程 那么在写这篇博客之前,先问一下大家为什么要写starter组件,仅仅只是为了炫技吗?还是真正的在业务中需要.在现在的开发环境下,什么是竞争力? 举例分页查询来说,每个来公司的程序员都有一套自己写分页的流程,但是这套流程基本上都是重复的,那么…

Docker学习笔记(一)概念理解

一、什么是docker容器 Docker容器是一种轻量级、可移植的软件封装技术,它允许开发者将应用程序及其依赖、配置文件、运行环境等打包到一个独立的、自包含的执行单元中。容器与虚拟机相似,都提供了隔离的运行环境,但容器更加轻量级&#xff0c…

如何清理电脑内存?让电脑运行如飞!

电脑内存(RAM)的清理对于维持系统的流畅运行至关重要。随着使用时间的增加,系统内存会被各种应用程序和后台进程占用,导致系统响应变慢,甚至出现卡顿现象。通过有效地清理内存,可以提升电脑的性能&#xff…

深入理解如何撤销 Git 中不想提交的文件

个人名片 🎓作者简介:java领域优质创作者 🌐个人主页:码农阿豪 📞工作室:新空间代码工作室(提供各种软件服务) 💌个人邮箱:[2435024119qq.com] &#x1f4f1…

MySQL内存使用率高且不释放问题排查与总结

背景 生产环境mysql 5.7内存占用超过90%以上,且一直下不来。截图如下: 原因分析 1、确定mysql具体的占用内存大小,通过命令:cat /proc/Mysql进程ID/status查看 命令执行后的结果比较多(其他参数的含义想了解可参考这…

静态路由的配置

5.3静态路由 静态路由由网络管理员手动配置,配置方便,对系统要求低,适用于拓扑结构简单并且稳定的小型网络。缺点是不能自动适应网络拓扑的变化,需要人工干预。 5.3.1静态路由实验 1、实验需求 ① 掌握路由表的概念&#xff1…

cpp随笔——如何实现一个简单的进程心跳功能

什么是进程的心跳 在我们日常后台服务程序运行中,一般是调度模块,进程心跳以及进程监控共同工作,进而实现实现服务的稳定运行,在前面我们介绍过如何去实现一个简单的调度模块,而今天我们所要介绍的就是如何实现进程的心跳,首先什么是进程的心…

git上传文件

git init git add . git commit -m " " git remote add origin 仓库的地址 git push -u origin master 如果出现以下问题 可以用这一句强制上传 git push -f origin master

Centos下rpm和yum执行卡住问题(已解决)

问题描述 执行rpm和yum卡住, 没有任何报错信息,且无法 ctrl c 终止,只能通过后台 kill -9 杀死。 问题排查: 查看yum日志:yum -vv 软件包 会发现卡在 loading keyring from rpmdb,即load DB存在问题。 …

使用 llamaIndex 快速实现智能体

AI 智能体就是可以根据当前环境进行推理,并根据处理结果进行下一步的操作。简单来说 AI 智能体可以与外界环境进行交互,并根据结果执行更复杂的操作。本文将通过llamaIndex 实现一个简单的 Agent 实时获取数据,由于大模型是通过静态数据进行训…

收银系统源码分享-PHP可二开

千呼新零售2.0系统是零售行业连锁店一体化收银系统,包括线下收银线上商城连锁店管理ERP管理商品管理供应商管理会员营销等功能为一体,线上线下数据全部打通。 适用于商超、便利店、水果、生鲜、母婴、服装、零食、百货、宠物等连锁店使用。 私有化独立…

游戏工作室如何巧妙应对IP封禁风险?

游戏工作室在使用IP时,面临着封号的风险,因此需要采取一些防封技巧来保护自己的运营。以下是一些游戏工作室常用的防封技巧。 1. 多IP轮换 游戏工作室可以使用多个代理IP,并定期轮换它们。这样做可以减少单个IP被频繁访问同一游戏服务器而被…

C++_03

1、构造函数 1.1 什么是构造函数 类的构造函数是类的一种特殊的成员函数,它会在每次创建类的新对象时执行。 每次构造的是构造成员变量的初始化值,内存空间等。 构造函数的名称与类的名称是完全相同的,并且不会返回任何类型,也不…

Windows系统安装SSH服务结合内网穿透配置公网地址远程ssh连接

前言 在当今的数字化转型时代,远程连接和管理计算机已成为日常工作中不可或缺的一部分。对于 Windows 用户而言,SSH(Secure Shell)协议提供了一种安全、高效的远程访问和命令执行方式。SSH 不仅提供了加密的通信通道,…