每日一题——Python实现PAT乙级1037 在霍格沃茨找零钱(举一反三+思想解读+逐步优化)


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

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

Python-3.12.0文档解读

目录

我的写法

时间复杂度分析:

空间复杂度分析:

我要更强

哲学和编程思想

1. 模块化(Modularity)

2. DRY原则(Don't Repeat Yourself)

3. 抽象化(Abstraction)

4. 代码的可读性(Readability)

5. 函数式编程思想(Functional Programming)

举一反三

1. 进一步封装和抽象

2. 优化数据处理

3. 提高代码质量

4. 写作干净且有意义的代码

5. 遵循设计模式

6. 代码简洁性和性能



题目链接
 


我的写法

# 从用户输入获取两个货币值P和A,并以空格分隔
P, A = input().split()# 将输入的货币值P和A根据点号'.'分解成列表,并将字符串转换成整数
P = list(map(int, P.split('.')))
A = list(map(int, A.split('.')))# 计算货币P的总纳特数,加隆乘以17再乘以29,西可乘以29,纳特直接相加
P = (17 * P[0]) * 29 + (P[1] * 29) + P[2]
# 计算货币A的总纳特数,同上
A = (17 * A[0]) * 29 + (A[1] * 29) + A[2]# 判断A是否小于P,若是,则信号为负号'-'
signal = '-' if A < P else ''# 计算P和A的绝对差值,并将差额转换回原来的货币格式,即加隆.西可.纳特
changes = [abs(A - P) // (29 * 17),   # 加隆数,用总差值除以一个加隆的纳特数abs(A - P) // 29 % 17,      # 西可数,用总差值除以一西可的纳特数取余数再对17取余数abs(A - P) % 29]            # 纳特数,用总差值对29取余数# 格式化输出结果,如果是负差额,前面会有负号
print(f"{signal}{changes[0]}.{changes[1]}.{changes[2]}")

这段代码是一个针对特殊货币系统的差额计算器。它使用简单的数学转换和模运算来计算和格式化两个货币输入之间的差额。这是一个非常专门化的工具,可能适用于某些游戏或特殊的货币转换场景。

时间复杂度分析:

  1. 分割输入的字符串和转换为整数列表是 O(n) 操作,其中 n 是输入字符串的长度。
  2. 两次的货币转换操作(计算P和A的总纳特数)是 O(1) 操作,因为这里只涉及到有限的几个乘法和加法运算。
  3. 计算差额和转换回原货币格式同样是 O(1) 操作,因为无论输入多大,这里的操作数都是固定的。

综上所述,整个操作的时间复杂度是 O(n),主要是由于对输入字符串进行分割和转换。

空间复杂度分析:

  1. 输入字符串被存储为两个额外的列表 P 和 A,这需要 O(m) 的空间,其中 m 是输入字符串分割成列表后元素的总数。
  2. 其他操作如货币的转换和差额计算使用了常数空间,因为它们存储了固定数量的变量。

因此,整个操作的空间复杂度是 O(m),主要由输入数据的存储决定。

整体评价: 代码本身比较简洁,并且直接了当地完成了任务。它正确地利用了整数除法和取余,来计算差额并将其分解成不同的货币单位。这样的代码对于处理货币计算的小型任务来说是有效且足够的。

不过,代码在健壮性方面有待改进。例如,它没有检查输入的格式是否正确(是否为三部分数字),也没有检查数字是否在合理范围内。在实际应用中,这些都是应该要考虑的因素。此外,如果这段代码要集成到一个大型的应用中,最好为这个功能封装成函数,这样可以提高代码的可读性和可重用性。


我要更强

这段代码实际上已经是相当高效的。它的时间复杂度在处理单次输入的情况下是 O(n),其中n是输入字符串的长度。因为字符串长度在这里是用户输入的,无法预先确定,所以无法优化输入分割的时间复杂度。

空间复杂度同样是 O(m),其中m是分割后的输入元素总数。由于每个输入字符串都需要被分割和转换为整数进行计算,这是必须占用的空间。

然而,如果考虑到这个脚本可能会被多次调用或者处理多个输入,可以通过创建函数来重复使用相同的代码,这样可以提高代码的可读性和可重用性。在函数中处理每对输入,将有助于保持全局命名空间的清洁,并减少潜在的错误。

以下是改进后的代码及注释:

def calculate_currency_difference(P, A):# 转换货币值为整数的纳特数P_knuts = (17 * P[0]) * 29 + (P[1] * 29) + P[2]A_knuts = (17 * A[0]) * 29 + (A[1] * 29) + A[2]# 判断需要输出的信号(正数还是负数)signal = '-' if A_knuts < P_knuts else ''# 计算差值并转换成货币格式diff = abs(A_knuts - P_knuts)galleons = diff // (29 * 17)sickles = (diff // 29) % 17knuts = diff % 29# 返回格式化的货币差值字符串return f"{signal}{galleons}.{sickles}.{knuts}"# 主函数,用于读取输入和输出结果
def main():P_input, A_input = input("Enter two currencies separated by space (e.g., 3.12.1 5.15.21): ").split()P = list(map(int, P_input.split('.')))A = list(map(int, A_input.split('.')))print(calculate_currency_difference(P, A))# 调用主函数
if __name__ == "__main__":main()

在这段代码中,将计算的部分封装成了 calculate_currency_difference 函数,接受两个分解为列表的货币值 P 和 A。主函数 main 负责读取用户输入,并将输入转化为所需的格式,然后调用 calculate_currency_difference 函数并打印结果。

这段代码保持了原有算法的时间复杂度和空间复杂度,但增加了可读性和可重用性。由于输入操作是用户驱动的,它们的效率依赖于用户输入的长度和数量,这些不是通过算法优化能够改变的。储存输入和计算差值的操作已经是最优的,因为它们分别是由输入大小和固定的变量数决定的。


哲学和编程思想

改进代码的过程中,实际上应用了几个重要的编程哲学和思想,特别是当涉及到代码的可读性、可维护性和效率时。以下是几个关键点:

1. 模块化(Modularity)

通过将货币差额的计算封装到独立的函数中,我们实现了模块化。模块化是软件设计的一个核心原则,它鼓励将一个大问题拆分成小的、更易于管理的部分。这样做可以提高代码的组织性,使得每个模块都可以独立地开发和测试,从而提高了代码的可读性和可维护性。

2. DRY原则(Don't Repeat Yourself)

通过创建函数来避免重复代码。DRY原则强调了减少重复的重要性,它推荐使用抽象化的方式来避免在多个地方编写相同的代码。这不仅可以减少维护时的工作量(因为修复bug或修改功能只需要在一个地方进行),同时也提高了代码的清晰度和可理解性。

3. 抽象化(Abstraction)

通过将具体的计算过程隐藏在函数内部,我们实现了抽象化。抽象化是编程中的一个关键概念,它允许编程者通过提供一个简化的模型来隐藏复杂的细节。在我们的例子中,其他开发者或未来的你不需要理解货币转换的具体实现就可以使用calculate_currency_difference函数。

4. 代码的可读性(Readability)

代码的组织方式使其更加易于阅读和理解。通过清晰命名的函数和变量,以及逻辑的分组,代码的目的和工作方式变得更容易被其他开发者(或未来的自己)理解。可读性是编程中的一个重要方面,因为它直接影响到代码的维护和更新的难易程度。

5. 函数式编程思想(Functional Programming)

虽然这个例子没有完全采用函数式编程的风格,但通过使用函数来封装独立的逻辑单元,它借鉴了函数式编程的一些理念。函数式编程强调通过函数来传递数据和操作,而不是依赖于共享的状态和可变的数据,这有助于减少错误和副作用。

总的来说,通过将计算逻辑封装在函数中,并提高代码的组织性和可读性,遵循了这些编程哲学和思想。这不仅使代码更加清晰和容易维护,也提升了其效率和可重用性。


举一反三

在遵循这些哲学和编程思想的基础上,可以通过以下技巧来提高自己的编程实践,让代码更加健壮、可维护和高效:

1. 进一步封装和抽象

  • 创建通用函数:尝试发现代码中的重复模式,并将它们抽象成可复用的函数。例如,如果你经常需要解析不同格式的输入数据,可以创建一个通用的解析函数。
  • 数据封装:使用类或结构体来管理数据,这样可以将数据和操作它们的方法组织在一起,增强代码的结构性和清晰度。

2. 优化数据处理

  • 使用适当的数据结构:根据需要选择合适的数据结构,例如使用集合(Set)进行快速查找操作,或使用队列(Queue)和栈(Stack)来处理顺序数据。
  • 避免过度计算:存储计算结果以避免不必要的重复计算,这种技术被称为缓存或记忆化。

3. 提高代码质量

  • 代码复审和对等编程:定期进行代码复审,邀请同事或朋友检查你的代码。这不仅可以帮助发现潜在错误,还可以作为交流最佳实践的机会。
  • 单元测试:编写单元测试来验证每个函数的行为,确保在修改代码后仍然能按预期工作。这有助于构建更加稳定和可靠的软件系统。

4. 写作干净且有意义的代码

  • 自解释的变量和函数命名:使用描述性强的命名,使得其他读者能够仅通过名称理解变量和函数的用途。
  • 保持函数专一:让每个函数只做一件事,保持其简短和专注。这样做不仅有助于代码复用,也使得维护和测试变得更容易。

5. 遵循设计模式

  • 学习并应用设计模式:设计模式如工厂模式、单例模式、装饰器模式等,是解决特定问题场景的经典方法。合理应用设计模式可以提高代码的灵活性和可维护性。

6. 代码简洁性和性能

  • 代码重构:定期重构代码,去除多余的复杂性,优化算法,使用更高效的方法解决问题。
  • 性能考量:在编写代码时,考虑其性能影响,特别是在循环、递归调用和大量数据操作中。使用性能分析工具来找到瓶颈并进行优化。

感谢阅读。

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

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

相关文章

立创·天空星开发板-GD32F407VE-USART

本文以 立创天空星开发板-GD32F407VET6-青春版 作为学习的板子&#xff0c;记录学习笔记。 立创天空星开发板-GD32F407VE-USART 基础通信概念同步通信 & 异步通信串行通信 & 并行通信双工 & 单工通讯速率码元 串口通信数据帧 串口封装 基础通信概念 通信协议是网络…

Python编程学习第一篇——Python零基础快速入门(五)—变量

在上一节中讲的元组和元组操作中&#xff0c;经常看到 tup (1, 2, 3) 这样的代码&#xff0c;这里面其实涉及了编程语言中一个重要的概念就是变量&#xff0c;前面的等式中tup是变量&#xff0c;(1, 2, 3) 是赋与变量的值。前面的一些文章的代码中也都有用到变量&#xff0c;下…

STM32F103实现双击、长按、短按后续

经过上次(上一篇文章)的bug&#xff0c;这次进行了修改&#xff0c;基本原理就是使用基本定时器的计数功能&#xff0c;根据计算赋值合适的arr&#xff08;预装载值&#xff09;以及psc&#xff08;预装载系数&#xff09;&#xff0c;使其实现100ms计时一次&#xff0c;在封装…

校园生活服务平台的设计

管理员账户功能包括&#xff1a;系统首页&#xff0c;个人中心&#xff0c;管理员管理&#xff0c;用户管理&#xff0c;跑腿管理&#xff0c;文娱活动管理&#xff0c;活动申请管理&#xff0c;备忘录管理 前台账户功能包括&#xff1a;系统首页&#xff0c;个人中心&#xff…

正确挑选百兆超薄款工业级网络/脉冲变压器(网络隔离滤波器)

Hqst华强盛&#xff08;石门盈盛电子&#xff09;导读&#xff1a;工业级百兆超薄款网络变压器的生产要特殊的超薄磁芯配正确线径的铜线&#xff0c;使用符合相应防潮标准的凝固胶水。 一 ̖ 首先来看下商业级的超薄款的百兆网络变压器&#xff1a; 商业级&#xff08;消费级&…

麒麟操作系统运维工程师(KYCP)课程,实现职业突破

在IT行业中&#xff0c;掌握先进的技能和知识是实现职业突破的关键。如果你希望在麒麟操作系统上成为一名卓越的运维工程师&#xff0c;那么麒麟操作系统运维工程师&#xff08;KYCP&#xff09;课程将是你的理想全面提升学员在麒麟操作系统环境下的运维能力。课程内容涵盖安全…

mac读不出来ntfs mac硬盘读不出来盘

新买的Mac电脑由于需要导入旧电脑的数据&#xff0c;因此通常会读取备份硬盘&#xff0c;通过硬盘进行导入。不过由于各种原因&#xff0c;有些mac用户反馈无法正常读取或写入NTFS移动硬盘&#xff0c;下面就通过本篇教程&#xff0c;简单讲述当mac读不出来ntfs&#xff0c;mac…

开关电源中电感设计

开关电源设计中电感 只有充分理解电感在DC/DC电路中发挥的作用,才能更优的设计DC/DC电路。本文还包括对同步DC/DC及异步DC/DC概念的解释。 在开关电源的设计中电感的设计为工程师带来的许多的挑战。工程师不仅要选择电感值,还要考虑电感可承受的电流,绕线电阻,机械尺寸等…

监控易监测对象及指标之:全面监控华为FusionInsight实例

在大数据时代&#xff0c;华为FusionInsight作为一款高性能的大数据处理平台&#xff0c;承载着企业关键业务数据的处理和分析任务。为了确保FusionInsight实例的稳定运行&#xff0c;对其进行全面监控显得尤为重要。本文基于监控易工具&#xff0c;对华为FusionInsight实例的监…

产气荚膜梭菌定植与婴儿食物过敏之间的关联

谷禾健康 牛奶蛋白过敏&#xff08;CMPA&#xff09;是婴儿最常见的食物过敏类型之一。粪便病原菌培养显示产气荚膜梭菌阳性率超过30%&#xff0c;明显高于其他细菌。因此推测产气荚膜梭菌定植可能是婴儿牛奶蛋白过敏的发病因素之一。 一项真实世界的研究&#xff0c;杨敏团队从…

Linux操作系统:MongoDB在虚拟机环境下的安装及部署

上传 MongoDB 安装包 将从官网下载好的 MongoDB 上传到要安装的服务器目录中&#xff0c;建议目录为&#xff1a;/usr/local/ 解压 MongoDB 安装包 cd /usr/local/ tar -zxvf mongodb-linux-x86_64-4.0.0.tgz mv mongodb-linux-x86_64-4.0.0 mongodb 创建 MongoDB 必要目录 …

高通CSIPHY combo mode介绍

目录 使用MIPI Switch 使用高通平台CSIPHY的Combo Mode YYYY使用Combo Mode电路图如下: 如何设置combo PHY mode CSIInfo configuration when camera works in normal mode 平台SoC一般都有多个CSIPHY以满足当前手机相机设计多摄的情况,但是一款SoC CSIPHY的个数也是一定…

【python】错误SyntaxError: invalid syntax的解决方法总结

解决Python报错&#xff1a;【Python】错误SyntaxError: invalid syntax的解决方法总结 SyntaxError是Python编程中常见的错误之一&#xff0c;它表明代码中有语法错误。这种错误可能由多种原因引起&#xff0c;包括但不限于拼写错误、错误的缩进、缺少括号等。本文将介绍几种常…

Python 机器学习 基础 之 【常用机器学习库】 scikit-learn 机器学习库

Python 机器学习 基础 之 【常用机器学习库】 scikit-learn 机器学习库 目录 Python 机器学习 基础 之 【常用机器学习库】 scikit-learn 机器学习库 一、简单介绍 二、scikit-learn 基础 1、安装 scikit-learn 2、导入 scikit-learn 3、数据准备 4、数据分割 5、训练模…

使用Gitblit软件开启git服务器

文章目录 使用Gitblit软件开启git服务器&#xff0c;供局域网其他电脑当做git仓库服务1. java依赖环境安装2. Mac系统操作2.1 下载Gitblit、配置参数2.2 启动服务2.3 终止服务&#xff1a;停止脚本即可 3. window系统操作3.1 下载Gitblit、配置参数3.2 启动服务3.3 终止服务&am…

Einstein Summation 爱因斯坦求和 torch.einsum

Einstein Summation 爱因斯坦求和 torch.einsum flyfish 理解爱因斯坦求和的基本概念和语法&#xff0c;这对初学者来说可能有一定难度。对于不熟悉该表示法的用户来说&#xff0c;可能不如直接的矩阵乘法表达式易于理解。 整个思路是 向量的点积 -》矩阵乘法-》einsum 向…

揭秘抖音矩阵号低成本高效运作批量账号的秘诀!

在当今互联网时代,抖音矩阵号搭建已经成为了许多企业和个人追求高效率媒介管理的重要方式,但是高效、低成本地运作这些账号却是一个相当具有挑战性的任务。 在这篇文章中,我将从抖音矩阵账号准备,如何低成本制作视频以及在进行内容制作时,如何高效运作批量账号等大家比较…

翻译软件就用DT浏览器

翻译软件就用DT浏览器

GUI GUIDER、LVGL、LCD驱动关系

理解GUI Guider、LVGL和LCD驱动之间的关系对于开发嵌入式图形用户界面&#xff08;GUI&#xff09;非常重要。以下是它们之间关系的详细说明&#xff1a; 1. LVGL&#xff08;Light and Versatile Graphics Library&#xff09; 简介&#xff1a;LVGL 是一个轻量级、灵活的嵌…

LeetCode 7- 整数反转

给你一个 32 位的有符号整数 x &#xff0c;返回将 x 中的数字部分反转后的结果。 如果反转后整数超过 32 位的有符号整数的范围 [-231, 231 - 1] &#xff0c;就返回 0。 假设环境不允许存储 64 位整数&#xff08;有符号或无符号&#xff09;。 示例 1&#xff1a; 输入&…