当前位置: 首页 > news >正文

每日一题——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. 持续学习和实践

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

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


相关文章:

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

一个认为一切根源都是“自己不够强”的INTJ 个人主页:用哲学编程-CSDN博客专栏:每日一题——举一反三Python编程学习Python内置函数 Python-3.12.0文档解读 目录 我的写法 代码结构和逻辑 时间复杂度 空间复杂度 代码优化建议 总结 我要更强 …...

还在Excel中管理您的持续改进项目吗?

对于大多数公司来说,Microsoft Excel是一种可靠的资源,它确实提供了极高的价值。然而,当它被用来跟踪持续改进项目时,它的价值就减少了。浪费时间从不同内部系统的不同报告中收集数据,会占用推动重要变革的时间。让我们…...

CentOS 7 内存占用过大导致 OOM Killer 杀掉了 Java 进程

说明 Linux进程被杀掉(OOM killer),查看系统日志 oom killer 详解 测试服务器, 有一个 Java 应用, 其进程偶尔会消失掉, 已排除人为杀死的可能 该服务器内存常年处于快被占满的状态, 怀疑是内存原因, 导致服务器主动杀死了该应用的 Java 进程…...

在postgrel中使用hints

在 PostgreSQL 中,可以使用查询提示(Query Hints)来影响查询优化器的行为,但需要注意的是,PostgreSQL 并不像一些商业数据库那样有丰富的提示语法,而是提供了一些基本的方式来引导优化器。 使用查询提示的…...

OceanBase Meetup北京站|跨行业应用场景中的一体化分布式数据库:AI赋能下的探索与实践

随着业务规模的不断扩张和数据处理需求的日益复杂化,传统数据库架构逐渐暴露出业务稳定性波动、扩展性受限、处理效率降低以及运营成本高等一系列问题。众多行业及其业务场景纷纷踏上了数据库现代化升级之路。 为应对这些挑战,7月6日,OceanB…...

Spring Boot:轻松设置全局异常处理

Spring Boot:轻松设置全局异常处理 在软件开发中,异常处理是一项至关重要的任务。对于使用Spring Boot的开发者来说,设置全局异常处理不仅可以提高代码的整洁度,还可以提升用户体验。本文将详细介绍如何在Spring Boot中轻松设置全…...

Omni3D目标检测

Omni3D是一个针对现实场景中的3D目标检测而构建的大型基准和模型体系。该项目旨在推动从单一图像中识别3D场景和物体的能力,这对于计算机视觉领域而言是一个长期的研究目标,并且在机器人、增强现实(AR)、虚拟现实(VR&a…...

前端三件套开发模版——产品介绍页面

今天有空,使用前端三件套html、css、js制作了一个非常简单的产品制作页面,与大家分享,希望可以满足大家应急的需求。本页面可以对产品进行“抢购”、对产品进行介绍,同时可以安排一张产品的高清大图,我也加入了页面的背…...

Android Bitmap 和Drawable的区别

Bitmap 和 Drawable 是 Android 图形绘制的两种常用方式,它们有各自的特点和使用场景。下面将详细解释它们之间的区别,并通过示例代码说明如何使用它们。 Bitmap 解释 Bitmap 是一种用于存储图像像素数据的类,通常用于图像处理和操作。Bit…...

Linux和windows网络配置文件的修改

Linux和windows网络配置文件的修改 网络配置文件是计算机网络管理中至关重要的一部分。正确配置网络文件可以确保计算机与网络设备之间的通信顺畅,避免网络故障。本文将详细介绍网络配置文件的修改方法,包括常见命令、使用方法举例,以及一些…...

【.NET全栈】第16章 Web开发

文章目录 前言16.1 HTML概述16.1.1 HTML的基本概念16.1.2 HTML语言的基本元素16.1.3 格式设置16.1.4 超级链接16.1.5 图像16.1.6 表格16.1.7 框架16.1.8 表单 16.2 ASP.NET Web Forms的组织16.2.1 认识ASP.NET16.2.2 Web Forms的组织 16.3 Web服务器控件16.3.1 使用Label和Text…...

检测水管缺水的好帮手-管道光电液位传感器

管道光电液位传感器是现代清水管道管理中的重要技术创新,不仅提高了检测液位的精确度,还解决了传统机械式和电容式传感器存在的诸多问题,成为检测管道缺水的可靠利器。 该传感器采用先进的光学感应原理,利用红外光学组件通过精密…...

渗透测试流程基本八个步骤

渗透测试遵循软件测试的基本流程,但由于其测试过程与目标的特殊性,在具体实现步骤上渗透测试与常见软件测试并不相同。渗透测试流程主要包括8个步骤,如下图所示: 下面结合上图介绍每一个步骤所要完成的任务。 (1 )明确目标 当测…...

2024年移动手游趋势:休闲类手游收入逆势增长,欧美玩家成为主力

移动手游广告情报平台Sensor Tower近期发布的报告显示,从宏观数据来看,尽管2023年对于移动游戏市场来说是艰难的一年,无论是总下载量亦或是总收入都较去年有所下降,尤其是Google Play。但在总体下降的大趋势下,休闲游戏…...

npm 淘宝镜像证书过期,错误信息 Could not retrieve https://npm.taobao.org/mirrors/node/latest

更换 npm 证书 问题描述报错原因更换步骤1 找到 nvm 安装目录2 发现证书过期3 更换新地址4 保存后,重新安装成功 问题描述 在使用 nvm 安装新版本时,未成功,出现报错: Could not retrieve https://npm.taobao.org/mirrors/node/l…...

axios发送请求,后端无法获取cookie

1.前端 axios默认不携带cookie 添加如下代码 import axios from "axios" const requrst axios.create({baseURL: import.meta.env.VITE_APP_URL,timeout: 5000,}) //让axios携带cookie requrst.defaults.withCredentials true 2.后端nestjs main.ts app.enabl…...

【Spring Boot 源码学习】初识 ConfigurableEnvironment

《Spring Boot 源码学习系列》 初识 ConfigurableEnvironment 一、引言二、主要内容2.1 Environment2.1.1 配置文件(profiles)2.1.2 属性(properties) 2.2 ConfigurablePropertyResolver2.2.1 属性类型转换配置2.2.2 占位符配置2.…...

开关电源中强制连续FCCM模式与轻载高效PSM,PFM模式优缺点对比笔记

文章目录 前言一、连续FCCM模式优点:缺点: 二,轻载高效PSM,PFM优点:缺点: 总结 前言 今天我们来学习下开关电源中,强制连续FCCM模式与轻载高效PSM,PFM模式优缺点对比 一、连续FCCM模式 优点: …...

5分钟教你用AI把老照片动起来,别再去花49块9的冤枉钱了

文章目录 需要的工具 最近,AI视频在各大平台上,又火了。 只是火的形式,变成了将老照片动起来,打情感牌,或者做很多经典电视剧的再整活。 直接把可灵的生成时间,从以前的4分钟,生生的干成了20分钟…...

Ruby 环境变量

Ruby 环境变量 概述 环境变量在编程中扮演着重要的角色,尤其是在Ruby这样的动态编程语言中。它们是操作系统用来存储有关其操作环境的信息的变量,可以在程序运行时影响其行为。Ruby程序可以通过环境变量来获取配置信息、系统细节或用户特定的设置。本文将深入探讨Ruby中环境…...

BPF:BCC工具 funccount 统计内核函数调用(内核函数、跟踪点USDT探针)认知

写在前面 博文内容涉及BCC工具 funccount 认知funccount 可以帮助用户追踪和分析Linux系统上特定函数、系统探针或USDT探针的运行次数。这对于性能分析、故障排查和系统优化等场景非常有用。理解不足小伙伴帮忙指正 😃,生活加油 不必太纠结于当下,也不必…...

DPO算法推导

DPO 核心思想:直接使用偏好数据进行策略优化,省去 reward 模型策略优化。 技术背景知识: 首先给定prompt x,生成两个答案 ( y 1 , y 2 ) Π S F T ( y ∣ x ) (y_1,y_2)~\Pi^{SFT}(y|x) (y1​,y2​) ΠSFT(y∣x) ,并通…...

Qt源码分析:窗体绘制与响应

作为一套开源跨平台的UI代码库,窗体绘制与响应自然是最为基本的功能。在前面的博文中,已就Qt中的元对象系统(反射机制)、事件循环等基础内容进行了分析,并捎带阐述了窗体响应相关的内容。因此,本文着重分析Qt中窗体绘制相关的内容…...

docker 安装 禅道

docker pull hub.zentao.net/app/zentao:20.1.1 sudo docker network create --subnet172.172.172.0/24 zentaonet 使用 8087端口号访问 使用禅道mysql 映射到3307 sudo docker run \ --name zentao2 \ -p 8087:80 \ -p 3307:3306 \ --networkzentaonet \ --ip 172.172.172.…...

【简要说说】make 增量编译的原理

make 增量编译的原理 make是一个工具,它可以根据依赖关系和时间戳来自动执行编译命令。 当您修改了源代码文件后,make会检查它们的修改时间是否比目标文件(如可执行文件或目标文件)新,如果是,就会重新编译…...

DETRs Beat YOLOs on Real-time Object Detection论文翻译

cvpr 2024 论文名称 DETRs在实时目标检测上击败YOLO 地址 https://arxiv.longhoe.net/abs/2304.08069 代码 https://github.com/lyuwenyu/RT-DETR 目录 摘要 1介绍 2.相关工作 2.1实时目标探测器 2.2.端到端物体探测器 3.检测器的端到端速度 3.1.NMS分析 3.2.端到端速度…...

SpringBoot 多数据源配置

目录 一. 引入maven依赖包 二. 配置yml 三、创建 xml 分组文件 四、切换数据源 一. 引入maven依赖包 <dependency><groupId>com.baomidou</groupId><artifactId>dynamic-datasource-spring-boot-starter</artifactId><version>3.6.1&…...

RK3568驱动指南|第十六篇 SPI-第192章 mcp2515驱动编写:完善write和read函数

瑞芯微RK3568芯片是一款定位中高端的通用型SOC&#xff0c;采用22nm制程工艺&#xff0c;搭载一颗四核Cortex-A55处理器和Mali G52 2EE 图形处理器。RK3568 支持4K 解码和 1080P 编码&#xff0c;支持SATA/PCIE/USB3.0 外围接口。RK3568内置独立NPU&#xff0c;可用于轻量级人工…...

#BI建模与数仓建模有什么区别?指标体系由谁来搭建?

问题1&#xff1a; 指标体系是我们数仓来搭建还是分析师来做&#xff0c;如何去推动&#xff1f; 问题2&#xff1a;BI建模与数仓建模有什么区别&#xff1f; 指标体系要想做好&#xff0c;其实是分两块内容的&#xff0c;一块是顶层设计阶段&#xff0c;业务指标体系的搭建&am…...

如何用Python实现三维可视化?

Python拥有很多优秀的三维图像可视化工具&#xff0c;主要基于图形处理库WebGL、OpenGL或者VTK。 这些工具主要用于大规模空间标量数据、向量场数据、张量场数据等等的可视化&#xff0c;实际运用场景主要在海洋大气建模、飞机模型设计、桥梁设计、电磁场分析等等。 本文简单…...