每日一题——Python实现PAT乙级1028 人口普查 Keyboard(举一反三+思想解读+逐步优化)六千字好文


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

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

Python-3.12.0文档解读

目录

题目链接​编辑我的写法

专业点评

时间复杂度分析

空间复杂度分析

总结

我要更强

优化代码

优化解释

进一步优化

总结

哲学和编程思想

1. KISS (Keep It Simple, Stupid)

2. DRY (Don't Repeat Yourself)

3. YAGNI (You Aren't Gonna Need It)

4. Separation of Concerns

5. Single Responsibility Principle (SRP)

6. Efficient Input/Output Handling

7. Algorithmic Efficiency

8. Minimal State

9. Readability and Maintainability

10. Resource Management

举一反三

1. KISS (Keep It Simple, Stupid)

2. DRY (Don't Repeat Yourself)

3. YAGNI (You Aren't Gonna Need It)

4. Separation of Concerns

5. Single Responsibility Principle (SRP)

6. Efficient Input/Output Handling

7. Algorithmic Efficiency

8. Minimal State

9. Readability and Maintainability

10. Resource Management

举一反三的具体技巧


题目链接我的写法

# 输入一个整数N,表示接下来有N个人的名字和生日需要输入
N = int(input())# 初始化合理的生日数量
resonable_birthdays_num = 0# 初始化最年轻人的名字
youngest_name = ''# 初始化最年轻人的生日为一个非常早的日期
youngest_birthday = 18140905# 初始化最年长人的名字
oldest_name = ''# 初始化最年长人的生日为一个非常晚的日期
oldest_birthday = 20140907# 使用循环从1运行到N次,用于输入每个人的名字和生日
for i in range(N):# 输入名字和生日,使用空格分隔name, birthday = input().split()# 将生日中的斜杠替换为空,并转换为整数格式birthday = int(birthday.replace('/', ''))# 检查生日是否在合理的范围内if 18140906 <= birthday <= 20140906:# 如果生日合理,合理生日数量加1resonable_birthdays_num += 1# 更新最年长人的数据,如果当前生日比最年长人的生日早if birthday < oldest_birthday:oldest_name = nameoldest_birthday = birthday# 更新最年轻人的数据,如果当前生日比最年轻人的生日晚if youngest_birthday < birthday:youngest_name = nameyoungest_birthday = birthday# 如果有合理的生日,输出合理的生日数量、最年长人的名字、最年轻人的名字
if resonable_birthdays_num:print(resonable_birthdays_num, oldest_name, youngest_name)
# 如果没有合理的生日,输出0
else:print('0')

这段代码是一个用于处理生日信息的小程序,通过输入多个名字和生日,找出其中最年长和最年轻的人。下面是对这段代码的专业点评以及时间复杂度和空间复杂度的分析。

专业点评

  1. 输入处理:
    • 数字N的输入和处理逻辑非常清晰。
    • 使用split()方法分割名字和生日,使用replace()方法处理生日格式再转换为整数,这是合理的。
  2. 初始化:
    • 变量的初始化清晰且符合逻辑,特别是对最年轻和最年长生日的初始值设置非常好。
  3. 逻辑判断:
    • 使用合理的范围(18140906到20140906)来判断生日是否在合理范围内,符合实际需求。
    • 更新最年长和最年轻人的逻辑分开处理,且条件明确。
  4. 输出结果:
  • 合理地检查了合理生日的数量,并根据不同情况输出相应的结果。

时间复杂度分析

时间复杂度是用来分析算法执行时间随输入规模增长的变化情况。

  1. 变量初始化:
    • 初始化变量O(1)。
  2. 输入处理和循环:
    • 循环N次处理输入,每次处理包含字符串分割、替换和转换操作,这些操作的时间复杂度为O(1)。
    • 因此,循环部分的总时间复杂度为O(N)。
  3. 更新逻辑:
    • 在每次循环中更新合理生日数量、最年长和最年轻人的逻辑都是常数时间操作O(1)。
  4. 输出结果:
  • 最后的输出操作也是常数时间O(1)。

综合上述分析,整个程序的时间复杂度为O(N)。

空间复杂度分析

空间复杂度是用来分析算法在运行过程中占用的内存空间。

  1. 变量初始化:
    • 初始化了多个变量,这些变量的空间复杂度为O(1)。
  2. 输入处理:
  • 每次处理一个输入,存储名字和生日的临时变量,且这些变量在每次循环结束后会被释放。
  • 由于我们不存储所有输入数据,只进行逐个处理,因此空间复杂度为O(1)。

综合上述分析,整个程序的空间复杂度为O(1)。

总结

这段代码逻辑清晰且结构合理,能够高效地处理输入数据并找出最年长和最年轻的人的名字。其时间复杂度和空间复杂度均为有效的O(N)和O(1),表现良好。可以考虑在输入数据量非常大的情况下进一步优化,例如通过更高效的输入处理方法或并行处理,但对于一般情况,这段代码已经非常健壮和高效。


我要更强

在这段代码中,时间复杂度已经是O(N),空间复杂度是O(1)。在这种情况下,进一步优化时间复杂度是不可行的,因为我们需要遍历所有输入以找到最年长和最年轻的人。不过,我们可以通过一些方式来提升代码的可读性和效率,比如:

  1. 使用更高效的输入方式来优化批量输入。
  2. 减少不必要的变量赋值来优化空间使用。

下面给出一些优化建议和相应的代码:

使用更高效的输入方式

在Python中,可以使用sys.stdin.read来一次性读取所有输入,然后逐行处理,这可能会提高大量输入情况下的速度。

合并部分逻辑

将最年长和最年轻人的检查逻辑合并到一次判断中。

优化代码

下面是优化后的代码:

import sys# 从标准输入读取所有数据
input_data = sys.stdin.read().strip().split('\n')# 第一个输入为整数N,表示接下来有N个人的名字和生日需要输入
N = int(input_data[0])# 初始化合理的生日数量
resonable_birthdays_num = 0# 初始化最年轻人的名字
youngest_name = ''# 初始化最年轻人的生日为一个非常早的日期
youngest_birthday = 18140905# 初始化最年长人的名字
oldest_name = ''# 初始化最年长人的生日为一个非常晚的日期
oldest_birthday = 20140907# 使用循环从1运行到N次,用于输入每个人的名字和生日
for i in range(1, N + 1):# 输入名字和生日,使用空格分隔name, birthday = input_data[i].split()# 将生日中的斜杠替换为空,并转换为整数格式birthday = int(birthday.replace('/', ''))# 检查生日是否在合理的范围内if 18140906 <= birthday <= 20140906:# 如果生日合理,合理生日数量加1resonable_birthdays_num += 1# 更新最年长或最年轻人的数据if birthday < oldest_birthday:oldest_name = nameoldest_birthday = birthdayif birthday > youngest_birthday:youngest_name = nameyoungest_birthday = birthday# 如果有合理的生日,输出合理的生日数量、最年长人的名字、最年轻人的名字
if resonable_birthdays_num:print(resonable_birthdays_num, oldest_name, youngest_name)
# 如果没有合理的生日,输出0
else:print('0')

优化解释

  1. 输入优化:
    • 使用sys.stdin.read()一次性读取所有输入数据并分割为行,这在处理大量输入时比逐行调用input()更高效。
  2. 减少变量赋值:
  • 合并最年轻和最年长人的判断逻辑,减少重复的条件判断和变量赋值操作。

进一步优化

在目前这段代码的时间复杂度和空间复杂度都已经是较优的状态。时间复杂度是O(N),空间复杂度是O(1)。在这种情况下,进一步优化主要体现在代码可读性和执行效率的小提升上。

总结

对于这个问题,进一步的优化空间有限。主要优化方向在于提高输入效率和减少冗余的代码。上述代码已经尽可能地优化了时间复杂度和空间复杂度,同时保持了代码的可读性和易维护性。


哲学和编程思想

在优化和重构代码的过程中,我们运用了多种编程思想和软件设计哲学。这些思想和哲学帮助我们编写更高效、可维护且可读性更好的代码。以下是具体说明:

1. KISS (Keep It Simple, Stupid)

尽量保持代码简单明了。复杂的解决方案容易引发错误且难以维护。我们在优化代码时,通过减少不必要的变量赋值和合并逻辑判断,保持了代码的简单性。

  • 应用例子: 合并最年长和最年轻人判断的逻辑。
if birthday < oldest_birthday:oldest_name = nameoldest_birthday = birthday
if birthday > youngest_birthday:youngest_name = nameyoungest_birthday = birthday

2. DRY (Don't Repeat Yourself)

避免代码重复,尽量使用统一的代码块来处理相似的任务。减少重复的代码不仅可以减少错误的发生,还能使代码更加简洁。

  • 应用例子: 合并生日范围判断后的逻辑处理。
if 18140906 <= birthday <= 20140906:resonable_birthdays_num += 1if birthday < oldest_birthday:oldest_name = nameoldest_birthday = birthdayif birthday > youngest_birthday:youngest_name = nameyoungest_birthday = birthday

3. YAGNI (You Aren't Gonna Need It)

只实现当前需要的功能,而不是预先考虑所有可能的功能需求。这样可以避免代码变得臃肿和复杂。

  • 应用例子: 只关注合理生日数量、最年长和最年轻人的逻辑处理,而没有引入额外不必要的功能。

4. Separation of Concerns

将不同的功能逻辑分离开来,使得每个部分只专注于其单一的功能,这样代码更容易理解和维护。

  • 应用例子: 输入处理和逻辑判断分开,清晰地分离了输入数据和业务逻辑。

5. Single Responsibility Principle (SRP)

每个模块或函数应该只有一个职责。这使得代码更加模块化,便于测试和维护。

  • 应用例子: 输入处理部分和结果输出部分分开,确保每段代码只处理一个功能。

6. Efficient Input/Output Handling

在处理大量数据时,使用高效的输入输出方法可以显著提升程序的性能。在Python中,使用sys.stdin.read()一次性读取所有输入数据而不是逐行读取是一种常见的优化方式。

  • 应用例子: 使用sys.stdin.read()来优化输入处理。
import sys
input_data = sys.stdin.read().strip().split('\n')

7. Algorithmic Efficiency

尽可能选择高效的算法和数据结构来解决问题,尽量减少时间和空间复杂度。

  • 应用例子: 使用O(N)复杂度的算法遍历输入数据,避免了多余的嵌套循环或不必要的复杂操作。

8. Minimal State

保持状态最小化,减少临时变量的使用和状态的改变,从而使代码更易于理解和调试。

  • 应用例子: 减少不必要的变量赋值,只保留必要的状态变量,如oldest_name和youngest_name。

9. Readability and Maintainability

编写易读的代码,使得代码在将来需要修改或扩展时更容易理解和维护。

  • 应用例子: 通过合理的变量命名和清晰的结构,使代码易于阅读和理解。

10. Resource Management

高效地管理资源,特别是在处理大量输入输出时,尽可能减少资源的浪费。

  • 应用例子: 使用sys.stdin.read一次性读取所有输入,减少多次I/O操作的开销。

通过运用这些编程思想和软件设计哲学,我们不仅优化了代码的时间和空间复杂度,还提高了代码的可维护性和可读性。这样不仅能确保当前需求得到高效的实现,还为将来的扩展和维护打下了良好的基础。


举一反三

以下是一些技巧和策略,帮助你在优化和重构代码时更好地应用这些编程思想和软件设计哲学:

1. KISS (Keep It Simple, Stupid)

  • 技巧: 从最直接、最简单的解决方案开始,如果简单的解决方案不能满足需求,再逐步增加复杂性。
  • 策略: 定期审查代码,问自己是否有更简单的方法来实现同样的功能。

2. DRY (Don't Repeat Yourself)

  • 技巧: 使用函数、类和模块来封装重复的代码段。
  • 策略: 进行代码审查时,特别留意重复的代码,尝试将其抽取成独立的函数或模块。

3. YAGNI (You Aren't Gonna Need It)

  • 技巧: 在实现功能时,严格限定在当前需求的范围内,不要过早优化或为可能的需求预留空间。
  • 策略: 在项目规划和代码评审时,确保每次只实现当前需求。

4. Separation of Concerns

  • 技巧: 将不同功能的代码分离到独立的模块或类中,使每个部分专注于单一职责。
  • 策略: 使用层次化设计,区分数据访问层、业务逻辑层和表现层。

5. Single Responsibility Principle (SRP)

  • 技巧: 每个函数或类只做一件事,并且名字能明确反映其职责。
  • 策略: 定期重构代码,确保每个模块或函数都符合单一职责原则。

6. Efficient Input/Output Handling

  • 技巧: 在处理大量数据时,尽量使用批量处理方法,减少I/O操作次数。
  • 策略: 优化数据流和缓冲区的使用,确保I/O操作的高效性。

7. Algorithmic Efficiency

  • 技巧: 选择合适的数据结构和算法,确保时间和空间复杂度最小化。
  • 策略: 在编写和优化代码时,使用复杂度分析工具和技术,确保高效实现。

8. Minimal State

  • 技巧: 只保留必要的状态,避免不必要的临时变量和状态变化。
  • 策略: 在代码编写和审查时,关注变量的生命周期和作用域,减少不必要的状态管理。

9. Readability and Maintainability

  • 技巧: 使用有意义的变量名、函数名和注释,提高代码的可读性。
  • 策略: 定期进行代码审查,确保代码清晰和易于理解。

10. Resource Management

  • 技巧: 使用上下文管理器和适当的资源释放机制,确保资源的高效利用。
  • 策略: 在处理文件、网络连接等资源时,使用with语句等上下文管理工具,确保资源得到正确管理。

举一反三的具体技巧

  1. 代码审查和重构: 定期进行代码审查,并将重构作为开发过程的一部分。识别并消除代码中的重复和复杂性。
  2. 学习和借鉴: 学习优秀开源项目代码,借鉴其设计模式和编程思想。分析和理解其背后的设计决策。
  3. 测试驱动开发(TDD): 使用TDD确保代码的可靠性和可维护性。编写测试用例可以帮助你更好地理解和分离代码的职责。
  4. 工具和自动化: 使用代码分析和格式化工具(如Pylint、Black等)保持代码风格一致性,自动化测试和部署流程。
  5. 文档和注释: 编写详尽的文档和注释,确保代码的可读性和可维护性。尤其是在代码复杂的地方,详细说明其逻辑和设计意图。

通过不断实践和反思这些技巧和策略,可以逐步提升代码质量,编写出高效、易维护且易读的代码。


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

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

相关文章

Python基础教程(十八):MySQL - mysql-connector 驱动

&#x1f49d;&#x1f49d;&#x1f49d;首先&#xff0c;欢迎各位来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里不仅可以有所收获&#xff0c;同时也能感受到一份轻松欢乐的氛围&#xff0c;祝你生活愉快&#xff01; &#x1f49d;&#x1f49…

碳化硅陶瓷膜良好的性能

碳化硅陶瓷膜是一种高性能的陶瓷材料&#xff0c;以其独特的物理和化学特性&#xff0c;在众多领域展现出了广泛的应用前景。以下是对碳化硅陶瓷膜的详细介绍&#xff1a; 一、基本特性 高强度与高温稳定性&#xff1a;碳化硅陶瓷膜是一种非晶态陶瓷材料&#xff0c;具有极高的…

从GAN到WGAN(02/2)

文章目录 一、说明二、GAN中的问题2.1 难以实现纳什均衡(Nash equilibrium)2.2 低维度支撑2.3 梯度消失2.4 模式坍缩2.5 缺乏适当的评估指标 三、改进的GAN训练四、瓦瑟斯坦&#xff08;Wasserstein&#xff09;WGAN4.1 什么是 Wasserstein 距离&#xff1f;4.2 为什么 Wassers…

53.Python-web框架-Django开始第一个应用的多语言

针对上一篇的功能&#xff0c;本次仅对页面做了多语言&#xff0c;大家可以看看效果。 51.Python-web框架-Django开始第一个应用的增删改查-CSDN博客 目录 部门列表 新增部门 编辑部门 部门列表 源码 <!DOCTYPE html> {% load static %} {% load i18n %} <html …

JAVA开发 使用Apache PDFBox库生成PDF文件,绘制表格

1. 表格位置定点 2.执行效果展示&#xff08;截取PDF文件图片&#xff09; 3.执行代码 当我们使用Apache PDFBox库在PDF文件中创建带有表格的内容&#xff0c;需要遵循几个步骤。PDFBox本身并没有直接的API来创建表格&#xff0c;但我们可以通过定位文本、绘制线条和单元格矩形…

shell编程基础(第16篇:命令是什么?有哪些注意事项)

前言 前面我们已经使用过各种各样的命令&#xff0c;那么命令到底是什么呢&#xff1f;我们又该怎么理解该术语&#xff1f; 什么是命令&#xff1f; 命令是command的中文翻译&#xff0c;能在命令行中执行的是命令。因为早期的计算机只有文字界面&#xff0c;命令是程序&#…

高速公路智能管理系统:构建安全畅通的数字大动脉

随着城市化进程的加速和交通需求的增长&#xff0c;高速公路系统作为城市交通的重要组成部分&#xff0c;正承担着越来越多的交通运输任务。为了提升高速公路的安全性、便捷性和智能化管理水平&#xff0c;高速公路智能管理系统应运而生。本文将深入探讨高速公路智能管理系统的…

Leetcode 剑指 Offer II 082.组合总和 II

题目难度: 中等 原题链接 今天继续更新 Leetcode 的剑指 Offer&#xff08;专项突击版&#xff09;系列, 大家在公众号 算法精选 里回复 剑指offer2 就能看到该系列当前连载的所有文章了, 记得关注哦~ 题目描述 给定一个可能有重复数字的整数数组 candidates 和一个目标数 tar…

能耗监控与管理平台

在当今社会&#xff0c;随着工业化、城市化的快速发展&#xff0c;能源消耗问题日益凸显&#xff0c;节能减排已成为全社会共同关注的焦点。在这个背景下&#xff0c;一款高效、智能的能耗监控与管理平台显得尤为重要。 一、HiWoo Cloud平台的概念 HiWoo Cloud是一款集数据采…

六大维度全面焕新升级!麒麟信安服务器操作系统V3.6.1引领未来计算

昨日&#xff0c;openEuler 24.03 LTS 正式发布&#xff0c;麒麟信安作为openEuler社区重要贡献者和参与者&#xff0c;充分发挥自身在国产操作系统领域的技术优势&#xff0c;在打造安全可靠、极致体验的操作系统上与社区共同努力&#xff0c;同步推出服务器操作系统V3.6.1&am…

OpenGL3.3_C++_Windows(7)

演示 最终演示效果 ​​​​ 冯氏光照 光照原理&#xff1a;对于向量相乘默认为点乘&#xff0c;如果*lightColor(1.0f, 1.0f, 1.0f);白光&#xff0c;值不变物体的颜色显示原理&#xff1a;不被物体吸收的光反射&#xff0c;也就是由白光分解后的一部分&#xff0c;因此&…

Cask ‘oraclexxx‘ is unavailable: No Cask with this name exists.

brew search oracle-jdk或brew search --cask oracle-jdk 原因&#xff1a;Homebrew官方仓库不再维护多个旧版本的OracleJDK 不推荐使用Homebrew环境安装JDK //指定版本安装 brew install --cask temurin17 //设置 JAVA_HOME 环境变量 //找到安装的JDK 版本的路径 /usr/lib…

探索测试分享

1. “器” 项目中的实践——我们是怎么做的 本章将带你身历其境的感受到思想和方法是如何具体使用在项目里的 1.如何挖掘探索性测试的探索点&#xff0c;在任何阶段都可以利用探索测试策略找到可探索的点&#xff0c;发现产品中的bug&#xff0c;或明显或隐含。 “器”的应用…

利用74HC165实现8路并行输入口的扩展

代码&#xff1a; #include <mega16.h>// Declare your global variables here #define hc165_clk PORTB.0 #define hc165_lp PORTB.1 #define hc165_out PINB.2unsigned char read_hc165(void) {unsigned char data0,i,temp0x80;hc165_lp0;hc165_lp1; for(i0;i<7;i)…

汇编:内联汇编和混合编程

C/C内联汇编 C/C 内联汇编&#xff08;Inline Assembly&#xff09;是一种在C或C代码中嵌入汇编语言指令的方法&#xff0c;以便在不离开C/C环境的情况下利用汇编语言的优势进行性能优化或执行特定的硬件操作。以下是一些详细的说明和示例&#xff0c;展示如何在C和C代码中使用…

zookeeper介绍 和 编译踩坑

zookeeper 分布式协调服务 ZooKeeper原理及介绍 - 鹿泉 - 博客园 Zookeeper是在分布式环境中应用非常广泛&#xff0c;它的优秀功能很多&#xff0c;比如分布式环境中全局命名服务&#xff0c;服务注册中心&#xff0c;全局分布式锁等等。 本项目使用其分布式服务配置中心&am…

Minecraft模组开发(fabric)之准备工作

Minecraft模组开发&#xff08;fabric&#xff09;之准备工作 最近心血来潮想开发个Minecraft的模组&#xff0c;一边学习一边开发&#xff0c;顺带着将一些步骤、学习心得整理下来。之所以选择fabric&#xff0c;是因为自己的光影包使用的是iris-fabric&#xff0c;所以就想着…

Vue41-vc实例与vm实例

一、 vc实例与vm实例的区别 vc实例与vm实例&#xff0c;99%结构都是类似的&#xff0c;仅2点不同&#xff1a; el属性data的书写格式 1-1、 el属性 vc有的功能vm都有&#xff0c;但是vm能通过el决定为哪个容器服务&#xff0c;但是vc却不行&#xff01; 1-2、data的书写格式

unity38——MemoryProfiler性能分析器,截帧分析当前性能占用率的具体文件

定义&#xff1a;性能分析器 (Unity Profiler) 是一种可以用来获取应用程序性能信息的工具。可以将性能分析器连接到网络中的设备或连接到已连接到计算机的设备&#xff0c;从而测试应用程序在目标发布平台上的运行情况。还可以在 Editor 中运行性能分析器&#xff0c;从而在开…

高精度减法的实现

这是C算法基础-基础算法专栏的第八篇文章&#xff0c;专栏详情请见此处。 引入 上次我们学习了高精度加法的实现&#xff0c;这次我们要学习高精度减法的实现。 高精度减法与高精度加法的定义、前置过程都是大致相同的&#xff0c;如果想了解具体内容&#xff0c;可以移步至我的…