每日一题——Python实现PAT乙级1019 数字黑洞(举一反三+思想解读+逐步优化)


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

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

Python-3.12.0文档解读

目录

我的写法

点评代码的优缺点:

时间复杂度:

空间复杂度:

改进点:

我要更强

哲学和编程思想

举一反三


 

我的写法

import sys  # 导入sys模块,以便使用sys.exit()函数来退出程序N=input()  # 从标准输入获取一个字符串
N=[int(i) for i in N.zfill(4)]  # 将输入的字符串填充至少4位,不足的部分用0填充,然后将每个字符转换为整数并存入列表Nl=int("".join(map(str,sorted(N,reverse=True))))  # 将列表N从大到小排序,转换成字符串然后转换成整数,赋值给l
r=int("".join(map(str,sorted(N))))  # 将列表N从小到大排序,转换成字符串然后转换成整数,赋值给rif l==r:  # 如果l和r相等,表示所有位数都相同print(f"{l} - {l} = 0000")  # 输出结果,并且结果为0000sys.exit(0)  # 退出程序while (l-r)!=6174:  # 当l和r的差不等于6174时,进入循环new=l-r  # 计算l和r的差,赋值给newprint("%04d - %04d = %04d" % (l,r,new))  # 格式化输出l、r和他们的差new=[int(i) for i in str(new).zfill(4)]  # 将new填充至至少4位,转换成字符串,每个字符转换为整数并存入列表newl=int("".join(map(str,sorted(new,reverse=True))))  # 将new列表从大到小排序,转换成字符串然后转换成整数,赋值给lr=int("".join(map(str,sorted(new))))  # 将new列表从小到大排序,转换成字符串然后转换成整数,赋值给relse:  # 当while循环退出时(当l-r等于6174)new=l-r  # 计算最后一次的l和r的差print("%04d - %04d = %04d" % (l,r,new))  # 格式化输出最后一次的l、r和他们的差

这段代码是为了解决卡普雷卡尔常数(Kaprekar's constant)问题,即通过不断对一个四位数进行排序和相减,来演示如何最终达到6174这个固定值(对于至少包含两个不同数字的四位数)。

点评代码的优缺点:

优点:

  1. 代码逻辑清晰,步骤分明,易于阅读和理解。
  2. 代码处理了输入数字不足四位的情况,通过使用zfill(4)来确保运算始终在四位数上进行。
  3. 格式化输出结果,易于用户查看每步的计算过程。

缺点:

  1. 缺乏输入验证,没有检查用户输入是否为合法的四位数字。
  2. 使用了sys.exit()来退出循环,这在某些情况下可能不是最好的实践。一般而言,应该避免在循环中使用退出函数,因为它会导致整个程序的退出,而不是仅仅跳出循环。可以考虑将循环放在一个函数中,并通过return来退出函数。
  3. 在每次循环中都进行了字符串和整数之间的相互转换,这增加了不必要的计算量和复杂性。

时间复杂度:

代码中的while循环最多会执行多少次不是固定的,它取决于初始数字到达6174需要的迭代次数。但对于任何至少包含两个不同数字的四位数,这个过程最多会迭代7次。因此,可以认为时间复杂度是O(1),即常数时间复杂度,与输入大小无关。

空间复杂度:

空间复杂度也是O(1),因为不管输入如何,代码中使用的变量数量保持不变,不会随着输入的增加而增加。

改进点:

对于该代码,可以考虑以下改进:

  • 添加对输入的验证,确保它是一个四位数,并且至少包含两个不同的数字。
  • 将重复的排序和转换操作封装为函数,减少代码的重复性并提高可读性。

考虑用更优雅的方式替代sys.exit()退出循环。


我要更强

为了优化时间复杂度和空间复杂度,我们可以考虑以下几点:

  1. 避免不必要的字符串和整数之间的转换。
  2. 使用更高效的数据结构和算法。
  3. 减少重复计算,例如,可以只对新产生的数字进行排序和转换,而不是每次都重新排序和转换。

下面是一个优化后的代码示例:

def kaprekar_process(num):# 确保输入是一个四位数if not (1000 <= num <= 9999) or len(set(str(num))) == 1:return "输入必须是一个至少包含两个不同数字的四位数"# 定义一个函数来计算Kaprekar过程的下一步def next_step(n):# 将数字转换为列表,方便排序digits = sorted([int(d) for d in str(n)])# 生成最大和最小可能的数字l = int(''.join(map(str, digits[::-1])))r = int(''.join(map(str, digits)))return l - r# 执行Kaprekar过程,直到结果为6174steps = 0while num != 6174:num = next_step(num)# 格式化输出print(f"{l:04d} - {r:04d} = {num:04d}")steps += 1return steps# 测试代码
num = int(input("请输入一个四位数:"))
steps = kaprekar_process(num)
print(f"完成Kaprekar过程,共执行了{steps}步。")

在这个优化后的代码中,我们定义了一个内部函数next_step来计算Kaprekar过程的下一步,这样可以避免重复的代码。我们还添加了输入验证,确保输入是一个有效的四位数。此外,我们只对新产生的数字进行排序和转换,而不是每次都重新排序和转换,这样可以减少计算量。

时间复杂度:

由于我们只对新产生的数字进行排序和转换,时间复杂度仍然是O(1),因为对于任何有效的四位数,Kaprekar过程最多执行7次。

空间复杂度:

空间复杂度也是O(1),因为我们使用的变量数量是固定的,不会随着输入的增加而增加。

这个代码示例已经尽可能地优化了时间复杂度和空间复杂度,同时保持了代码的可读性和可维护性。


哲学和编程思想

优化这段代码涉及到的哲学和编程思想主要包括:

  1. 抽象化(Abstraction): 通过定义内部函数next_step,我们将计算Kaprekar过程的下一步的逻辑抽象出来,使得主函数更加简洁,易于理解和维护。这种抽象化的思想是编程中的一个基本原则,它允许我们将复杂的系统分解为更小、更易于管理的部分。

  2. 模块化(Modularity): 将功能分解为独立的模块或函数,每个模块负责一个特定的任务。这不仅提高了代码的可读性,还使得代码更容易测试和重用。在这个例子中,next_step函数就是一个模块,它负责计算Kaprekar过程的下一步。

  3. 优化(Optimization): 在编程中,优化通常指的是通过改进算法或数据结构来提高程序的性能。在这个例子中,我们避免了不必要的字符串和整数之间的转换,减少了计算量,从而优化了时间复杂度。

  4. DRY原则(Don't Repeat Yourself): 这个原则鼓励开发者避免代码重复。通过将重复的逻辑封装在next_step函数中,我们遵循了DRY原则,使得代码更加简洁和可维护。

  5. 输入验证(Input Validation): 在处理用户输入时,确保输入的有效性是至关重要的。这不仅有助于防止错误,还可以提高程序的健壮性。在这个例子中,我们添加了输入验证,确保输入是一个有效的四位数。

  6. 迭代(Iteration): 迭代是编程中的一个基本概念,它允许我们重复执行一组操作,直到满足某个条件。在这个例子中,我们使用了一个while循环来迭代执行Kaprekar过程,直到结果为6174。

  7. 格式化输出(Formatted Output): 格式化输出是一种编程实践,它使得输出更加清晰和易于理解。在这个例子中,我们使用了格式化字符串来确保输出始终是四位数,并且易于阅读。

这些哲学和编程思想是软件开发中的核心原则,它们有助于提高代码的质量、可维护性和性能。通过应用这些原则,可以创建出更加健壮、高效和易于理解的程序。


举一反三

以下是一些基于前面提到的哲学和编程思想的技巧,可以帮助在不同的编程场景中应用这些原则:

  1. 追求干净、可读的代码(DRY原则):

    • 标识重复的代码块并将它们抽象成函数或方法。
    • 使用循环和递归来处理重复的逻辑,而不是手动拷贝和粘贴代码。
    • 创建通用的代码模块,用于执行频繁使用的任务。
  2. 优化性能:

    • 分析代码,找出瓶颈,例如使用性能分析工具。
    • 选择合适的数据结构和算法来解决问题,例如使用哈希表来快速查找数据,而不是列表。
    • 避免在循环内部进行不必要的计算,将可以在循环外计算的表达式提出来。
  3. 简化复杂性(Abstraction):

    • 封装复杂的操作,提供简单的接口。
    • 避免过度工程,从最简单的解决方案开始,然后根据需要迭代和改进。
    • 使用设计模式来处理常见的设计问题。
  4. 提高代码的模块化(Modularity):

    • 设计独立的模块,每个模块执行一个单一的任务。
    • 使用接口或抽象类来定义模块之间的互动。
    • 尽量减少模块之间的依赖关系。
  5. 输入验证(Input Validation):

    • 总是检查外部输入,不要假定它们是有效的。
    • 使用异常处理来管理预期外的情况。
    • 对用户输入执行合理性检查,如数据类型、格式和范围。
  6. 迭代(Iteration):

    • 采用迭代的方法来逐步改进程序。
    • 使用版本控制系统来管理代码的变化,这样你可以安全地探索不同的解决方案。
    • 测试你的代码在每一次改进后的表现。
  7. 格式化输出(Formatted Output):

    • 使用字符串格式化来创建清晰、可读的输出。
    • 确保输出数据的格式符合用户的期望和行业标准。
    • 为输出的数据提供合适的上下文,使其对用户有意义。

这些技巧不仅限于特定的语言或框架;它们是普遍适用的编程实践,可以帮助编写更优质的代码。在实际应用中,应该根据具体的情况和需求灵活运用它们。


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

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

相关文章

【类型商店】字符字符串(下)

啊&#xff0c;哈喽&#xff0c;小伙伴们大家好。我是#Y清墨&#xff0c;今天呐&#xff0c;我要介绍的是字符与字符串。 导语 前两期&#xff0c;我们已经懂得了概念&#xff0c;今天来看些函数。 正题 一.增加或连接 &#xff08;1) 后面增加() string s1,s2; //定义 s…

Meta首席AI科学家Yann LeCun指出生成式AI的不足

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

express入门01服务器搭建以及get和post请求的监听

微搭提供了后端API的能力&#xff0c;但是不同的版本收费差别巨大&#xff0c;因为使用的门槛限制了中小企业使用低代码平台。那可不可以既要又要呢&#xff1f;答案是肯定的&#xff0c;那其实掌握一定的后端框架&#xff0c;借助我们在低代码中已经熟练掌握的技能其实是比较容…

OpenCV学习(4.9) OpenCV中的轮廓

1.目标 了解轮廓是什么。学习寻找轮廓&#xff0c;绘制轮廓等您将看到以下功能&#xff1a;**cv.findContours()** &#xff0c;**cv.drawContours()* 2.什么是轮廓 轮廓可以简单地解释为连接具有相同颜色或强度的所有连续点(沿边界)的曲线。轮廓是用于形状分析以及对象检测…

友情提示:lazarus的tsortgrid.autofillcolumns存在BUG

直接在tsortgrid的属性中设置autofillcolumns为true&#xff0c;会提示&#xff1a;123个错误。即使修改为false&#xff0c;编译运行照样会出现上述错误。唯一解决的办法就是删除sortgrid重新添加一个。 代码设置SortGrid1.AutoFillColumns : TRUE不受影响。

【Windows】UWP - Application Frame 窗口句柄溯源

目录 一、问题描述 二、解决方案 三、测试代码 参考文献 本文出处链接&#xff1a;[https://blog.csdn.net/qq_59075481/article/details/139574981]。 一、问题描述 当 GUI 线程的窗口属于 Windows/UWP 应用程序时&#xff0c;它们始终由进程 ApplicationFrameHost 托管…

量化投资分析平台 迅投 QMT(六)资产定价绕不过去的BSM模型

量化投资分析平台 迅投 QMT [迅投 QMT](https://www.xuntou.net/?user_code7NYs7O)我目前在使用什么是BSM模型CQF课程介绍模型的五个重要的假设模型公式 我们为啥要学&#xff08;知道&#xff09;这玩意儿呢&#xff1f;隐含波动率&#xff08;Implied Volatility&#xff09…

初阶 《函数》 4. 函数的调用

4. 函数的调用 4.1 传值调用 函数的形参和实参分别占有不同内存块&#xff0c;对形参的修改不会影响实参 4.2 传址调用 传址调用是把函数外部创建变量的内存地址传递给函数参数的一种调用函数的方式 这种传参方式可以让函数和函数外边的变量建立起真正的联系&#xff0c;也就是…

堆和栈(heap and stack)

1、堆&#xff1a;一块内存空间&#xff0c;可以从中分配一个小buffer&#xff0c;用完后再把它放回去。 2、栈&#xff1a;也是一块内存空间&#xff0c;cpu的sp寄存器指向它&#xff0c;它可以用于函数调用、局部变量、多任务系统里保存现场。 PUSH [r3-r6,lr]; #将r3到r6寄…

26.多边形的判定

上海市计算机学会竞赛平台 | YACSYACS 是由上海市计算机学会于2019年发起的活动,旨在激发青少年对学习人工智能与算法设计的热情与兴趣,提升青少年科学素养,引导青少年投身创新发现和科研实践活动。https://www.iai.sh.cn/problem/499 题目描述 给定 𝑛n 个整数 𝑎1,𝑎…

Nacos注册中心和配置中心

1 nacos简介 1.1nacos介绍 Nacos是阿里的一个开源产品&#xff0c;它是针对微服务架构中的服务发现、配置管理、服务治理的综合型解决方案。是微服务的注册中心和配置中心&#xff0c;相当于springcloudEureka和springconfig的集合。 Nacos 致力于帮助您发现、配置和管理微服务…

使用Leaflet-canvas-label进行个性化标注实践详解

目录 前言 一、leaflet-canvas-label属性 1、地图展示属性 2、Canvas文本标注属性 3、事件列表 二、属性设置实战 1、标注放大比例 2、字体颜色和方向偏移 3、标注文字透明色设置 4、标注显示层级 三、事件绑定 1、颜色改变 2、事件绑定解析 3、标记初始化的一个小…

28.找零

上海市计算机学会竞赛平台 | YACSYACS 是由上海市计算机学会于2019年发起的活动,旨在激发青少年对学习人工智能与算法设计的热情与兴趣,提升青少年科学素养,引导青少年投身创新发现和科研实践活动。https://www.iai.sh.cn/problem/744 题目描述 有一台自动售票机,每张票卖 …

一文详解大模型微调全流程

节前&#xff0c;我们星球组织了一场算法岗技术&面试讨论会&#xff0c;邀请了一些互联网大厂朋友、参加社招和校招面试的同学. 针对算法岗技术趋势、大模型落地项目经验分享、新手如何入门算法岗、该如何准备、面试常考点分享等热门话题进行了深入的讨论。 汇总合集&…

【大学物理】波动光学:光的衍射

23.2 单缝的夫琅禾费衍射_哔哩哔哩_bilibili 1 光的衍射和惠更斯-菲涅尔原理 干涉vs衍射&#xff1a;干涉研究的是两个分立的子光源&#xff0c;衍射研究的是连续的子光源。 两位科学家用分解的思想&#xff0c;一个解决了方向一个解决了光强。 2 单缝的夫琅禾费衍射 夫琅禾…

【JAVASE】java语法(成员变量与局部变量的区别、赋值运算符中的易错点)

一&#xff1a;成员变量与局部变量的区别 区别 成员变量 局部变量 类中位置不同 …

【第14章】SpringBoot实战篇之多环境配置

文章目录 前言一、通用配置文件1. 定义2. 使用2.1 application.yml2.2 启动类 3. 测试 二、多环境配置文件1.定义1.1 application-local.yml1.2 application-dev.yml1.3 application-test.yml1.4 application-prod.yml 2.使用2.1 application.yml2.2 启动类 3.测试 三、多环境配…

OpenGL-ES 学习(6)---- Ubuntu OES 环境搭建

OpenGL-ES Ubuntu 环境搭建 此的方法在 ubuntu 和 deepin 上验证都可以成功搭建 目录 OpenGL-ES Ubuntu 环境搭建软件包安装第一个三角形基于 glfw 实现基于 X11 实现 软件包安装 sudo apt install libx11-dev sudo apt install libglfw3 libglfw3-dev sudo apt-get install…

​2020-2024 idea最新安装激活

前言&#xff1a;怎么才能既免费&#xff0c;又能使用上正式版呢&#xff01;&#xff08;不是正版用不起&#xff0c;而是‘激活’更有性价比&#xff09; 1-2 下载安装&#xff0c;此处省略 记得安装好不要打开&#xff0c;看下一步。 3.开始 3.1打开idea 首先打开idea&am…

Dish-TS: 缓解分布转移的一般范例 时间序列预测

摘要 时间序列预测(TSF)中的分布移位(即序列分布随时间的变化)在很大程度上阻碍了TSF模型的性能。现有的关于时间序列中分布变化的研究大多局限于分布的量化&#xff0c;更重要的是&#xff0c;忽视了回望窗和地平线窗之间的潜在变化。为了应对上述挑战&#xff0c;我们系统地…