每日一题——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:
        # 如果生日合理,合理生日数量加1
        resonable_birthdays_num += 1
        
        # 更新最年长人的数据,如果当前生日比最年长人的生日早
        if birthday < oldest_birthday:
            oldest_name = name
            oldest_birthday = birthday
        
        # 更新最年轻人的数据,如果当前生日比最年轻人的生日晚
        if youngest_birthday < birthday:
            youngest_name = name
            youngest_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:
        # 如果生日合理,合理生日数量加1
        resonable_birthdays_num += 1
        
        # 更新最年长或最年轻人的数据
        if birthday < oldest_birthday:
            oldest_name = name
            oldest_birthday = birthday
        if birthday > youngest_birthday:
            youngest_name = name
            youngest_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 = name
    oldest_birthday = birthday
if birthday > youngest_birthday:
    youngest_name = name
    youngest_birthday = birthday

2. DRY (Don't Repeat Yourself)

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

  • 应用例子: 合并生日范围判断后的逻辑处理。
if 18140906 <= birthday <= 20140906:
    resonable_birthdays_num += 1
    if birthday < oldest_birthday:
        oldest_name = name
        oldest_birthday = birthday
    if birthday > youngest_birthday:
        youngest_name = name
        youngest_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. 文档和注释: 编写详尽的文档和注释,确保代码的可读性和可维护性。尤其是在代码复杂的地方,详细说明其逻辑和设计意图。

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


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

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

相关文章

Star-CCM+自动网格执行方法与设置技巧

在Star中进行一个仿真项目时,有时会创建多个自动网格。网格创建结束后需要执行。在Star中,网格执行可以分为三种。分别是:单独执行操作;多个执行操作;全部执行操作。接下来将三种执行操作的方法与步骤进行介绍。 其次,如果不习惯用自定义控制网格,有时在一个项目中就会…

认识一些分布函数-Gumbel分布

1. Gumbel分布 Gumbel分布(也称为古贝尔型)是一种常用的非对称极值分布( Extreme Value Distribution,EVD),用于建模极大值和极小值,也就是所谓的EVD Type I分布。例如,EVD Type I 被用来预测地震、洪水和其他自然灾害,以及在风险管理中建模操作风险和那些在一定年龄…

关于阿里云效流水线自动部署项目教程

1、登录阿里云效:阿里云登录 - 欢迎登录阿里云&#xff0c;安全稳定的云计算服务平台 2、点击左侧流水线&#xff1a; 3、在流水线界面&#xff0c;新建流水线 4、我的是php代码&#xff0c;因此选择php模版 5、创建之后添加流程线源&#xff0c;如下图 6、选择相应的源头。比…

eclipse中报出Invaild project path

一、问题&#xff1a; 二、提示分析&#xff1a; 资源路径位置类型无效的项目路径&#xff1a;找到重复的路径条目 项目路径中有一个名为"/eclipse_rtt_demo"的条目被多次定义&#xff0c;这在Eclipse的构建路径设置中是不允许的。这个重复的条目既被标记为系统包含…

Studio One软件最新版下载及详细安装教程

Studio One 6是一款功能丰富、专业级的音乐制作软件&#xff0c;它具备灵活的工作流程和高效的团队协作能力&#xff0c;能帮助用户实现高质量的音乐创作和制作。 智能模板更快的启动&#xff0c;全新的智能模板为你手头的任务提供了必要的工具集&#xff0c;包括基本录制、混音…

【个人云盘连接助手】解决多个用户账号无法同时映射到本地磁盘问题

问题 家里买了个联想个人云盘&#xff0c;但是使用SAMBA映射到windows本地磁盘时&#xff0c;每次只能连接到一个账户上&#xff0c;于是想着写个小工具&#xff0c;方便切换多个用户账户&#xff0c;自动映射到本地磁盘 开发简介 开发语言&#xff1a;python 主要实现功能&…

训练营第三十六天| 337.打家劫舍 III121. 买卖股票的最佳时机

337.打家劫舍 III 力扣题目链接(opens new window) 在上次打劫完一条街道之后和一圈房屋后&#xff0c;小偷又发现了一个新的可行窃的地区。这个地区只有一个入口&#xff0c;我们称之为“根”。 除了“根”之外&#xff0c;每栋房子有且只有一个“父“房子与之相连。一番侦察…

工业屏:千万不要以为电脑显示啥样,工业屏就啥样,注意色差。

重要的事情说三遍&#xff1a;一定要放到实际场景下调色&#xff0c;定要放到实际场景下调色&#xff0c;定要放到实际场景下调色。 工业控制屏的色域通常比普通电脑显示器要小。工业控制屏主要用于工业环境中&#xff0c;需要满足特定行业的需求和标准。由于工业控制屏的设计…

深度剖析淘宝扭蛋机源码:打造趣味性电商活动的秘诀

在当今电商市场中&#xff0c;如何吸引用户的注意力、提升用户的参与度成为了各大电商平台竞相追求的目标。淘宝扭蛋机作为一种新型的电商活动形式&#xff0c;以其趣味性和互动性深受用户喜爱。本文将深度剖析淘宝扭蛋机源码&#xff0c;探讨其如何打造趣味性与互动性并存的电…

可视化图表走起来(1):桑基图,一目了然数据流向。

从事可视化设计&#xff0c;什么时候选用什么样的图表非常重要&#xff0c;今天来介绍一下桑基图的定义、场景、数据项等等&#xff0c;贝格前端工场愿意与各位老铁一道成长。 一、桑基图的定义 桑基图&#xff08;Sankey diagram&#xff09;是一种特殊类型的可视化图表&…

深入解析 Spring Cloud Sentinel:分布式系统流量控制与熔断降级的全面指南

&#x1f4e2;&#x1f4e2;&#x1f4e2; 深入解析 Spring Cloud Sentinel&#xff1a;分布式系统流量控制与熔断降级的全面指南 Spring Cloud Sentinel 是阿里巴巴开源的一款强大的分布式系统流量防卫组件&#xff0c;专为微服务架构设计&#xff0c;提供流量控制、熔断降级…

【Spring6】13-19章 JdbcTemplate+代理模式+AOP+Spring事务+Spring集成MyBatis

十三、JdbcTemplate JdbcTemplate是Spring提供的一个JDBC模板类&#xff0c;是对JDBC的封装&#xff0c;简化JDBC代码。 当然&#xff0c;你也可以不用&#xff0c;可以让Spring集成其它的ORM框架&#xff0c;例如&#xff1a;MyBatis、Hibernate等。 接下来我们简单来学习一下…

【LVGL】Guider 界面分析

文章目录 前言架构创建 UI切换界面空间释放分析创建页面空间变化 前言 分析Gui Guider-1.7.2-GA 生成的 LVGL 界面切换&#xff0c;资源管理等处理 架构 所有控件存放于同一个结构体 lv_ui 内&#xff0c;每个页面都至少包含 screen_xxx 和 screen_xxx_del 两个成员 typede…

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…

大数据可视化电子沙盘:前端技术的全新演绎

随着大数据时代的到来&#xff0c;数据可视化成为了一个重要的技术趋势。数据可视化不仅可以让复杂的数据变得更加直观易懂&#xff0c;还能帮助我们更好地分析和理解数据。在本文中&#xff0c;我们将深入探讨一种基于HTML/CSS/Echarts等技术的大数据可视化电子沙盘&#xff0…

MAC系统下安装VUE

下载node.js 点击链接 选择图片中的稳定版本 安装node.js 打开终端&#xff0c;输入 node -v 和 npm -v 显示如上信息表示安装成功 安装vue脚手架&#x1f527; sudo npm install -g vue/cli查看vue版本 vue -V6. 启动项目 1 采用 图形页面方式 控制台输入&#xff…

前端菜鸡流水账日记 -- Pagination分页

哈喽哇大家&#xff0c;老规矩&#xff0c;见面先问好&#xff0c;今天是端午节假期后的第一天上班&#xff0c;大家假期开心吗&#xff0c;哈哈哈哈&#xff0c;我还是蛮开心的... 今天这篇笔记要分享得主要是一个分页器&#xff0c;但是不一样得地方是因为&#xff0c;首先是…

5G和LED显示屏的关系

显示屏和5G看似没有直接关系&#xff0c;但实际上&#xff0c;两者之间的关联非常密切。北京的LED显示屏行业依赖于网络技术的进步&#xff0c;才有了今天的发展。随着5G时代的到来&#xff0c;万物互联的全面开启将为LED显示屏行业带来新的机遇和挑战。本文将详细探讨5G与LED显…

项目采购管理

目录 1.概述 2.三个子过程 2.1.规划采购管理 2.2.实施采购 2.3.控制采购 2.4.归属过程组 3.应用场景 3.1.十个应用场景 3.2.软件开发项目 3.2.1. 需求识别和分析 3.2.2. 制定采购计划 3.2.3. 发布采购请求 3.2.4. 供应商评估与选择 3.2.5. 合同签订 3.2.6. 采购…

解决Unity-2020 安卓异形屏黑边

背景 Unity 2020.3.17 版本开发的游戏&#xff0c;打apk包&#xff0c;发现两个问题 如图下午所示&#xff0c;实体白色导航栏&#xff0c;阻挡了整个安卓UI界面&#xff0c;难看还影响美观。 安卓系统 12-13 版本手机&#xff0c;异形屏。一侧安全区黑边遮挡&#xff0c;占空间…