每日一题——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填充,然后将每个字符转换为整数并存入列表N

l=int("".join(map(str,sorted(N,reverse=True))))  # 将列表N从大到小排序,转换成字符串然后转换成整数,赋值给l
r=int("".join(map(str,sorted(N))))  # 将列表N从小到大排序,转换成字符串然后转换成整数,赋值给r

if l==r:  # 如果l和r相等,表示所有位数都相同
    print(f"{l} - {l} = 0000")  # 输出结果,并且结果为0000
    sys.exit(0)  # 退出程序

while (l-r)!=6174:  # 当l和r的差不等于6174时,进入循环
    new=l-r  # 计算l和r的差,赋值给new
    print("%04d - %04d = %04d" % (l,r,new))  # 格式化输出l、r和他们的差
    new=[int(i) for i in str(new).zfill(4)]  # 将new填充至至少4位,转换成字符串,每个字符转换为整数并存入列表new
    l=int("".join(map(str,sorted(new,reverse=True))))  # 将new列表从大到小排序,转换成字符串然后转换成整数,赋值给l
    r=int("".join(map(str,sorted(new))))  # 将new列表从小到大排序,转换成字符串然后转换成整数,赋值给r

else:  # 当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过程,直到结果为6174
    steps = 0
    while num != 6174:
        num = next_step(num)
        # 格式化输出
        print(f"{l:04d} - {r:04d} = {num:04d}")
        steps += 1

    return 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.mfbz.cn/a/695897.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

DAMA学习笔记(一)-数据管理

1.引言 数据管理(Data Management) 是为了 交付、 控制、 保护 并 提升 数据和信息资产的 价值 , 在其整个生命周期中制订 计划、 制度、 规程和实践 活动, 并 执行 和 监督 的过程。 数据管理专业人员(Data Management Professional) 是指 从事数据管理各方面的工作…

Cinema 4D 2024 软件安装教程、附安装包下载

Cinema 4D 2024 Cinema 4D&#xff08;C4D&#xff09;是一款由Maxon开发的三维建模、动画和渲染软件&#xff0c;广泛用于电影制作、广告、游戏开发、视觉效果等领域。Cinema 4D允许用户创建复杂的三维模型&#xff0c;包括角色、场景、物体等。它提供了多种建模工具&#x…

Flink 基于 TDMQ Apache Pulsar 的离线场景使用实践

背景 Apache Flink 是一个开源的流处理和批处理框架&#xff0c;具有高吞吐量、低延迟的流式引擎&#xff0c;支持事件时间处理和状态管理&#xff0c;以及确保在机器故障时的容错性和一次性语义。Flink 的核心是一个分布式流数据处理引擎&#xff0c;支持 Java、Scala、Pytho…

数据库期末设计——图书管理系统

目录 1.前置软件以及开发环境&#xff1a; 2.开发过程讲解 代码环节&#xff1a; 数据库代码 1.BookDao.java 2.BookTypeDao.java 3.UserDao.java 4.Book.java 5.BookType.java 6.User.java 7.DbUtil.java 8.Stringutil.java 9.BookAddInterFrm.java 10.BookMan…

redis 05 复制 ,哨兵

01.redis的复制功能&#xff0c;使用命令slaveof 2. 2.1 2.2 3. 3.1 3.1.1 3.1.2 3.1.3 4 4.1 4.2 例子 5.1 这里是从客户端发出的指令 5.2 套接字就是socket 这里是和redis事件相关的知识 5.3 ping一下

Capture One 23 软件安装教程、附安装包下载

Capture One Capture One 23 是一款功能极为全面的图片处理软件&#xff0c;为用户提供了真正的逼真色彩处理和无缝衔接的编辑体验&#xff0c;以及业界最快的联机拍摄功能&#xff0c;可以满足用户在图像创作上的所有功能&#xff0c;如创作全景拼接大图、高级色彩调整、遮罩…

【Golang】Map 稳定有序遍历的实现与探索:保序遍历之道

【Golang】Map 稳定有序遍历的实现与探索&#xff1a;保序遍历之道 大家好 我是寸铁&#x1f44a; 总结了一篇【Golang】Map 稳定有序遍历的实现与探索&#xff1a;保序遍历之道✨ 喜欢的小伙伴可以点点关注 &#x1f49d; 前言&#x1f34e; 在计算机科学中&#xff0c;数据结…

GAT1399协议分析(7)--pycharm anaconde3 配置pyside2

一、安装pyside2 pip install pyside2 二、配置qtdesigner File->Settings->Tools->External tools 点击添加&#xff0c;添加QtDesigner&#xff0c; 注意designer.exe路径&#xff0c;需要在虚拟环境下。 三、添加pySide2 File->Settings->Tools->Ext…

Long-Context LLM综述

目录 前言1. Preliminary2. 方法分类3. 长度外推3.1 位置外推和插值位置外推插值 3.2 上下文窗口分割与滑动3.3 提示压缩 4. 注意力近似4.1 低秩分解4.2 稀疏注意力4.3 Softmax-free Attention 5. Attention-free Transformers5.1 状态空间模型(State Space Model, SSM)5.2 位置…

Spark作业运行异常慢的问题定位和分析思路

一直很慢 &#x1f422; 运行中状态、卡住了&#xff0c;可以从以下两种方式入手&#xff1a; 如果 Spark UI 上&#xff0c;有正在运行的 Job/Stage/Task&#xff0c;看 Executor 相关信息就好。&#x1f4bb; 第一步&#xff0c;如果发现卡住了&#xff0c;直接找到对应的…

【每日算法】

算法第15天| (二叉树part02)层序遍历、226.翻转二叉树(优先掌握递归)、101. 对称二叉树(优先掌握递归) 文章目录 算法第15天| (二叉树part02)层序遍历、226.翻转二叉树(优先掌握递归)、101. 对称二叉树(优先掌握递归)一、层序遍历二、226. 翻转二叉树(优先掌握递归)三、101. 对…

【机器学习】Python与深度学习的完美结合——深度学习在医学影像诊断中的惊人表现

&#x1f525; 个人主页&#xff1a;空白诗 文章目录 一、引言二、深度学习在医学影像诊断中的突破1. 技术原理2. 实际应用3. 性能表现 三、深度学习在医学影像诊断中的惊人表现1. 提高疾病诊断准确率2. 辅助制定治疗方案 四、深度学习对医疗行业的影响和推动作用 一、引言 随着…

MYSQL基础_02_MySQL环境搭建

第02章_MySQL环境搭建 1. MySQL的卸载 步骤1&#xff1a;停止MySQL服务 在卸载之前&#xff0c;先停止MySQL8.0的服务。按键盘上的“Ctrl Alt Delete”组合键&#xff0c;打开“任务管理器”对话框&#xff0c;可以在“服务”列表找到“MySQL8.0”的服务&#xff0c;如果现…

【C#线程设计】3:threadpool

实现&#xff1a; &#xff08;1&#xff09;.控件&#xff1a;group Box&#xff0c;text Box&#xff0c;check Box&#xff0c;label&#xff0c;botton&#xff0c;richtextbox 控件拉取见&#xff1a;https://blog.csdn.net/m0_74749240/article/details/139409510?spm1…

java中异常-异常概述+异常体系结构

一、异常概述 1、什么是异常&#xff1f; java程序在运行时出现的不正常情况 2、java中提供的默认的异常处理机制 java中对java程序运行时可能会出现的每种不正常情况都创建了一个唯一对应的类&#xff0c;在java程序运行时如果出现不正常情况&#xff0c;java程序就会创建…

【NOI】C++程序结构入门之循环结构三——break、continue

文章目录 前言一、循环的流程控制1.1 导入1.2 循环的打破与跳过1.2.1 break 打破1.2.2 continue 跳过1.2.3 总结 二、例题讲解问题&#xff1a;1468. 小鱼的航程问题&#xff1a;1074 - 小青蛙回来了问题&#xff1a;1261. 韩信点兵问题&#xff1a;1254. 求车速问题&#xff1…

10.结构体、共用体、枚举

头文件&#xff1a;#include<string.h> //struct&#xff1a;结构体关键字 //stu&#xff1a;结构体类型名&#xff0c;指定了一个结构体类型&#xff0c;它相当于一个模型&#xff0c;但其中并无具体数据&#xff0c;系统对之也不分配实际内存单元//使用结构体类型必须是…

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

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

Matlab|混合策略改进的蝴蝶优化算法

目录 1 主要内容 2 部分代码 3 程序结果 4 下载链接 1 主要内容 程序主要对蝴蝶算法&#xff08;BOA&#xff09;进行改进&#xff0c;参考文献《基于改进蝴蝶优化算法的冗余机器人逆运动学求解》&#xff0c;有如下改进策略&#xff1a; 改进1&#xff1a;采用反向学习策…

2024 年最佳 iPhone 数据恢复软件

最好的 iPhone 数据恢复软件是什么&#xff1f; 说到 iPhone 数据恢复&#xff0c;拥有合适的软件对于恢复丢失或删除的文件至关重要&#xff0c;无论是照片、视频、消息、联系人还是其他重要数据。那么&#xff0c;最好的 iPhone 数据恢复软件是什么&#xff1f;有几个因素有…