每日一题——PAT(乙级)1002 写出这个数(举一反三、思想解读)


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

个人主页:用哲学编程-CSDN博客
专栏:每日一题——举一反三
题目链接

我的写法:

nums_sounds={0:'ling',1:'yi',2:'er',3:'san',4:'si',5:'wu',6:'liu',7:'qi',8:'ba',9:'jiu',
}sum=0inputs=input()
input_nums=[]
for i in inputs:sum+=eval(i)sum=str(sum)index=1
for i in sum:print(nums_sounds[eval(i)],end='')if index<len(sum):print(end=' ')index+=1

代码点评:
 

这段代码的主要功能是读取用户输入的一串数字,计算这些数字的总和,然后将总和的每一位数字转换为对应的中文读音,并按顺序输出。下面是对这段代码的专业点评:

代码结构和功能

  1. 字典定义:定义了一个字典nums_sounds,将数字0-9映射到它们的中文读音。
  2. 初始化:初始化一个变量sum为0,用于存储数字的总和。
  3. 用户输入:通过input()函数获取用户输入,并将其存储在inputs变量中。
  4. 求和:遍历用户输入的每个字符,将其转换为数字并累加到sum中。
  5. 转换为字符串:将sum转换为字符串,以便逐个处理每一位数字。
  6. 输出中文读音:遍历sum字符串的每一位,将其转换为数字,然后查找对应的读音并输出。如果当前位不是最后一位,则在读音后添加一个空格。

时间复杂度分析

  • 用户输入:input()函数的时间复杂度可以忽略不计,因为它通常是常数时间。
  • 求和:遍历用户输入的每个字符,时间复杂度为O(n),其中n是用户输入的字符数。
  • 转换为字符串:将整数转换为字符串的时间复杂度为O(log sum),因为整数的位数是其对数。
  • 输出中文读音:遍历sum字符串的每一位,时间复杂度为O(log sum)。

总的时间复杂度为O(n + log sum),其中n是用户输入的字符数,sum是用户输入数字的总和。在最坏的情况下,如果用户输入的数字非常多,时间复杂度将接近O(n)。

空间复杂度分析

  • 字典nums_sounds:存储了10个键值对,空间复杂度为O(1)。
  • 用户输入:存储用户输入的字符串,空间复杂度为O(n),其中n是用户输入的字符数。
  • 变量sum:存储数字的总和,空间复杂度为O(1)。
  • 变量inputs和input_nums:虽然代码中声明了这两个变量,但实际上input_nums没有被使用,因此它们的空间复杂度可以忽略。

总的空间复杂度为O(n),主要由用户输入的字符串决定。

改进建议

  1. 变量使用:变量input_nums没有被使用,可以删除以避免混淆。
  2. 安全性:使用eval()函数处理用户输入是不安全的,因为它会执行任意代码。应该使用int()函数将字符转换为整数。
  3. 代码清晰度:可以在输出中文读音时,直接使用字典nums_sounds的键来查找值,而不是使用eval()函数。
  4. 错误处理:代码没有处理用户输入非数字字符的情况,可以添加错误处理逻辑。

综上所述,这段代码实现了预期的功能,但在安全性和代码清晰度方面有改进空间。时间复杂度在最坏情况下接近O(n),空间复杂度为O(n)。
 

我要更强!

对于这段代码,由于它的主要操作是基于输入字符串的逐字符处理,时间复杂度的优化空间相对有限。不过,我们可以通过几种方式来改进代码的效率和安全性,同时尽可能降低空间使用。

优化时间复杂度

  1. 直接求和:由于我们最终关心的是输入数字的和,可以在处理输入字符串时直接累加数值,而不是首先转换成数字再求和。这里没有明显的时间复杂度降低,因为主要瓶颈在于对输入字符串的遍历,但这样可以减少不必要的转换步骤,提高代码效率。

优化代码(非时间复杂度)

  1. 使用int()而非eval():为了安全性,应当使用int(i)替换eval(i)进行字符串到整数的转换。
  2. 减少不必要的变量:由于input_nums未使用,可以将其删除,以简化代码。

优化空间复杂度

  1. 减少临时存储:由于最终只需要输出数字的和的中文读音,不需要存储中间转换的任何数组或列表,所以实际上空间复杂度已经是比较优化的了。确保不创建不必要的数据结构,可以保持空间复杂度最小。

优化后的代码

nums_sounds = {0: 'ling',1: 'yi',2: 'er',3: 'san',4: 'si',5: 'wu',6: 'liu',7: 'qi',8: 'ba',9: 'jiu',
}# 初始化总和为0
sum = 0# 获取输入并直接计算总和
inputs = input()
for i in inputs:sum += int(i)  # 安全地将每个字符转换为整数并累加# 将总和转换为字符串,以便逐个处理每个数字
sum_str = str(sum)# 输出对应的中文读音
for index, i in enumerate(sum_str):print(nums_sounds[int(i)], end='')if index < len(sum_str) - 1:print(' ', end='')

结论

虽然针对这个特定问题的时间复杂度优化空间有限(主要受限于输入字符串的长度),通过上述修改,代码变得更加安全、简洁。最重要的是,我们已经采取措施降低了空间复杂度到最低,即O(1)的额外空间(不计算输入字符串和最终输出所占的空间)。

这种方法用到哪些哲学和编程思想

这段代码的实现和优化体现了以下哲学和编程思想:

1. 简单性(Simplicity)

  • KISS原则(Keep It Simple, Stupid):代码应该尽可能简单,避免不必要的复杂性。优化后的代码删除了未使用的变量,简化了求和过程,使得代码更加清晰易懂。

2. 安全性(Security)

  • 最小权限原则(Principle of Least Privilege):在编程中,应该只使用完成任务所必需的最小权限。通过避免使用eval()函数,代码减少了执行潜在恶意代码的风险。

3. 效率(Efficiency)

  • 优化算法和数据结构:虽然在这个特定情况下时间复杂度的优化空间有限,但通过直接累加数值而不是先转换再求和,代码提高了执行效率。

4. 可读性(Readability)

  • 代码即文档(Code as Documentation):良好的代码应该是自解释的,变量名和函数名应该清晰地反映其用途。在这个例子中,nums_sounds字典的命名清晰地表明了其用途。

5. 迭代和改进(Iteration and Improvement)

  • 迭代开发(Iterative Development):代码的优化过程体现了迭代开发的思想,即通过不断的小步骤改进来完善代码。

6. 抽象(Abstraction)

  • 使用字典进行映射:通过使用字典nums_sounds,代码抽象了数字到中文读音的映射关系,使得代码更加模块化和可维护。

7. 错误预防(Error Prevention)

  • 防御性编程(Defensive Programming):虽然代码没有显式地处理错误,但通过避免使用eval()函数,代码预防了潜在的安全错误。

8. 单一职责原则(Single Responsibility Principle)

  • 模块化设计:每个函数或代码块应该只有一个职责。在这个例子中,每个部分(输入处理、求和、输出)都专注于完成一个特定的任务。

9. 可扩展性(Scalability)

  • 设计可扩展的代码:虽然在这个简单的例子中不明显,但通过保持代码的模块化和简单性,可以更容易地在未来添加新功能或处理更复杂的情况。

举一反三:
 

通过从前述优化方法中提取的哲学和编程原则,可以应用以下技巧来提高编程技能,使你能够在不同的场景下举一反三:

1. 追求简洁明了的代码

  • 削减不必要的代码:定期审查代码,移除未使用的变量和函数。这不仅能提高代码的清晰度,还可以减少潜在的错误来源。
  • 简化逻辑:尽可能简化算法和逻辑。如果有两种方式实现相同的功能,选择更简单的那一种。

2. 注重代码的安全性

  • 避免使用危险函数:识别并避免使用那些可能导致安全漏洞的函数,如eval()。
  • 输入验证:总是验证外部输入,防止注入攻击或不良数据破坏应用程序。

3. 提高效率

  • 算法优化:学习和应用数据结构和算法的知识,以找到更有效率的解决方案。
  • 利用空间换时间:在可接受的空间复杂度范围内,考虑使用数据缓存等技术来提高程序执行的速度。

4. 重视可读性和维护性

  • 命名规范:使用有意义且一致的命名规范,使得其他开发者(或未来的你)可以更容易理解代码的意图。
  • 分解大型任务:将复杂的任务分解成小的、可管理的函数或模块,每个都只负责一个具体的功能。

5. 定期重构

  • 重构以提升质量:不要害怕重构代码以提高其可读性、安全性或性能。随着需求的演变和技术的进步,代码重构是必要的。

6. 编写可扩展的代码

  • 设计模式:学习和应用设计模式,以编写高效、可重用且易于扩展的代码。
  • 模块化:保持代码的高内聚低耦合,使各部分之间的依赖最小化,从而简化未来的修改和扩展。

7. 持续学习和实践

  • 学习新技术:定期学习新的编程语言、工具和最佳实践,保持你的技能与时俱进。
  • 代码评审:参与代码评审,学习他人的优秀实践,并接受建设性的反馈来改进自己的代码。

以上为本期全部内容,感谢阅读。

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

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

相关文章

绝地求生:29.2商城更新内容预览:挣脱尘网通行证,经典皮肤返场,空投活动

就在今天历经9小时维护&#xff0c;29.2版本终于上线&#xff0c;柠檬茶带大家一起看看&#xff0c;这次游戏里都更新了哪些内容吧。 挣脱尘网通行证 豪华版&#xff1a;$14.99 普通版&#xff1a;$4.99 豪华版比普通版多10级升级券和2套生存者宝箱 分支一 分支二 分支三 额外…

现代加密技术(对称和非对称加密)

1.分类 现代加密技术&#xff1a;对称和非对称加密&#xff0c;对称加密即共享密钥&#xff0c;非对称加密是公钥加密算法。 2.基础总结 AES是什么算法&#xff1f; 分组加密算法&#xff0c;对称加密算法AES的分组长度是&#xff1f;固定128位AES密钥长度是多少&#xff1f;支…

树莓派3B+入门(无外设)

昨日刚到一块树莓派3B&#xff0c;甚是喜爱&#xff0c;然半宿未眠 1、下载 在官网先下载烧录文件https://www.raspberrypi.com/software/ 下载完毕打开&#xff0c;选择&#xff0c;根据自己板子型号定 操作系统用最新的就行&#xff0c;64位不太稳定 储存卡&#xff0c;需…

C++ | Leetcode C++题解之第91题解码方法

题目&#xff1a; 题解&#xff1a; class Solution { public:int numDecodings(string s) {int n s.size();// a f[i-2], b f[i-1], c f[i]int a 0, b 1, c;for (int i 1; i < n; i) {c 0;if (s[i - 1] ! 0) {c b;}if (i > 1 && s[i - 2] ! 0 &&a…

24HN逆向部分wp

24H&N逆向部分wp 菜鸡新手师傅wp&#xff0c;Re 5/9&#xff0c;记录一下qaq&#xff08;好久没写博客了&#xff0c;水一篇hh&#xff09; 最喜欢的逆向题 64位&#xff0c;进主函数之后直接看&#xff0c;要求输入第5位为i&#xff0c;然后后面依次相等&#xff0c;长…

DevOps + 架构

一、DevOps 1定义 开发&#xff0c;测试&#xff0c;运维&#xff0c;甚至运营。出一个东西&#xff0c;就能马上走完一个流程&#xff0c;看效果 软件交付的速度和质量很重要 二、架构 1、解决系统复杂度 首先找到系统复杂度在哪里。 经典案例&#xff1a; 假设我们需要设…

Vue3实战笔记(22)—路由Vue-Router 实战指南(路由传参)

文章目录 前言一、路由router-link二、路由传参1.query方式2.params方式3.props传参 总结 前言 vue-router 是 Vue.js 官方路由管理器。它和 Vue.js 核心深度集成&#xff0c;让用 Vue.js 构建单页应用变得易如反掌。 前面提到过简单的使用路由&#xff0c;直到上文使用404界面…

僵尸网络的威胁值得关注

僵尸网络&#xff08;botnet&#xff09;是指一组受到恶意软件感染并遭到恶意用户控制的计算机。术语“僵尸网络”由“机器人&#xff08;bot&#xff09;”和“网络&#xff08;network&#xff09;”两个词组合而成&#xff0c;每台受感染设备被称为“机器人”。僵尸网络可用…

视频下载器 - 网页视频自动嗅探2.2.4

【应用名称】&#xff1a;视频下载器 - 网页视频自动嗅探 【适用平台】&#xff1a;#Android 【软件标签】&#xff1a;#Video #Downloader 【应用版本】&#xff1a;2.2.4 【应用大小】&#xff1a;33MB 【软件说明】&#xff1a;软件升级更新。支持多种格式的看片神器&am…

【AI+agent智能助手】使用Dify新手小白也能分分钟构建属于自己的 AI 原生应用

最近有读者看了我这篇文章 【人工智能】字节版GPTs「扣子」coze免费使用chatGPT4模型操作步骤 &#xff0c; 私信我有没有本地私有化 智能体推荐。 这里推荐一款&#xff0c; Dify支持私有化部署&#xff0c;新手小白也能分分钟构建属于自己的 AI 原生应用。 官方地址&#…

如何将Git仓库中的文件打包成zip文件?

要将Git仓库中的文件打包成zip文件&#xff0c;您可以使用git archive命令。这个命令允许您将任何git可访问的树或提交导出成一个归档文件。以下是一些基本的步骤&#xff1a; 打开命令行或终端。切换到您的Git仓库的目录。执行git archive命令。 git archive --formatzip --o…

3D Tiles资源大全

本文汇总整理3D Tiles相关的各种资源&#xff0c;包括查看器、生成器、示例数据集、教程、演示等。 1、3D Tiles特色演示 注意&#xff1a;这些演示是基于 CesiumJS 1.87.1 Release 发布的&#xff0c;其中包括对 3D Tiles Next 扩展的实验性支持。这些演示中显示的大多数功能现…

Linux进程(三) --- 状态和优先级

运行&#xff0c;阻塞&#xff0c;挂起 运行 (Running) 当一个进程处于运行状态时&#xff0c;它正在使用CPU执行指令。进程在以下两种情况下可能被认为是运行状态&#xff1a; 实际运行&#xff08;Running on CPU&#xff09;&#xff1a; 进程当前正在CPU上执行。可运行&…

如何利用R包进行主成分分析和可视化

一. 使用R包“FactoMineR”进行主成分分析&#xff08;PCA&#xff09; 基本步骤如下&#xff1a; 安装和加载包&#xff1a;如果尚未安装&#xff0c;首先安装“FactoMineR”包&#xff0c;然后加载它&#xff1a; install.packages("FactoMineR")library(FactoM…

在springboot项目中自定义404页面

今天点击菜单的时候不小心点开了一个不存在的页面&#xff0c;然后看到浏览器给的一个默认的404页面 后端的程序员都觉得这页面太丑了&#xff0c;那么怎么能自定义404页面呢&#xff1f; 很简单&#xff0c;在我们的springboot的静态资源目录下创建一个error包&#xff0c;然…

ue引擎游戏开发笔记(41)——行为树的建立(2)--丰富ai行为:巡逻后返回原处

1.需求分析&#xff1a; 就敌人ai而言&#xff0c;追踪到敌人有可能丢失目标&#xff0c;丢失目标后应该能返回原来位置&#xff0c;实现这一功能。 2.操作实现&#xff1a; 1.思路&#xff1a;利用clear value函数&#xff0c;禁用掉当前的追踪功能&#xff0c;执行之后的返…

积温空间分布数据、气温分布数据、日照数据、降雨量分布、太阳辐射数据、地表径流数据、土地利用数据、npp数据、ndvi数据

引言 积温是某一时段内逐日平均气温之和,它是研究植物生长、发育对热量的要求和评价热量资源的一种指标,是影响植物生长的重要因素之一&#xff0c;对指导农业生产和生态建设具有非常重要的意义。作为重要的气候资源&#xff0c;积温与其它资源的区别在于存在很大的地域差异和时…

Python | Leetcode Python题解之第91题解码方法

题目&#xff1a; 题解&#xff1a; class Solution:def numDecodings(self, s: str) -> int:n len(s)# a f[i-2], b f[i-1], c f[i]a, b, c 0, 1, 0for i in range(1, n 1):c 0if s[i - 1] ! 0:c bif i > 1 and s[i - 2] ! 0 and int(s[i-2:i]) < 26:c aa,…

C++——STL容器——List

1. 前言 List也是STL容器的一种&#xff0c;是C提供的链表结构的容器。C中所提供的list是双向带头循环链表&#xff0c;我们这篇文章通过自己模拟实现来学习list的使用。 为了避免和库中的命名冲突&#xff0c;也为了封装的考虑&#xff0c;我们将我们的list放入一个命名空间之…

微服架构基础设施环境平台搭建 -(七)Kubesphere pod内安装vimping命令

微服架构基础设施环境平台搭建 -&#xff08;七&#xff09;Kubesphere pod安装vim&ping命令 在K8s集群运维过程&#xff0c;需要进入pod容器内通过ping来测试网络是否通畅&#xff0c;或使用vim进行编辑文件&#xff0c;但是pod容器默认情况下是不支持ping、vim命令的&…