每日一题——Python实现PAT乙级1012 数字分类(举一反三+思想解读+逐步优化)五千字好文

一个认为一切根源都是“自己不够强”的INTJ
个人主页:用哲学编程-CSDN博客
专栏:每日一题——举一反三
Python编程学习
Python内置函数
Python-3.12.0文档解读
目录
我的写法
代码优点
代码缺点
时间复杂度
空间复杂度
代码改进建议
我要更强
哲学和编程思想
KISS原则(Keep It Simple, Stupid):
DRY原则(Don't Repeat Yourself):
抽象化:
模块化编程:
优化算法和数据结构:
可读性和可维护性:
测试和调试:
举一反三
保持代码简洁:
避免重复代码:
抽象化:
模块化编程:
优化算法和数据结构:
提高可读性和可维护性:
测试和调试:
题目链接

我的写法
# 从输入中读取数字,并将其转换为整数列表
nums = list(map(int, input().split()))# N 是第一个元素,表示后面有多少个数
N = nums[0]# 存储后面的 N 个数
nums = nums[1:]# 初始化 5 个结果变量,分别对应 A1, A2, A3, A4, A5
A1 = A2 = A3 = A4 = A5 = 0# 标志变量,用于记录是否存在符合条件的 A2 的数字
is_A2_no_N = False# A2 的加减标志,初始化为 1,表示第一次遇到的数加,第二次减,依此类推
A2_flag = 1# A4 的计数器,记录符合条件的数字的个数,用于计算平均值
A4_count = 0# 遍历 N 个数,进行分类和求值
for num in nums:# 如果数字是 5 的倍数且是偶数,累加到 A1if num % 5 == 0 and num % 2 == 0:A1 += num# 如果数字除以 5 余 1,根据标志位进行加减运算,累加到 A2elif num % 5 == 1:is_A2_no_N = TrueA2 += A2_flag * numA2_flag *= -1 # 反转标志位# 如果数字除以 5 余 2,计数累加到 A3elif num % 5 == 2:A3 += 1# 如果数字除以 5 余 3,累加到 A4,并计数elif num % 5 == 3:A4 += numA4_count += 1# 如果数字除以 5 余 4,更新 A5 为最大值elif num % 5 == 4 and A5 < num:A5 = num# 如果 A4 有符合条件的数字,计算其平均值
if A4_count:A4 = A4 / A4_count# 将结果存储在列表中
results = [A1, A2, A3, A4, A5]# 遍历结果列表,处理输出
for i in range(5):if results[i] == 0:# 如果结果为 0,特殊处理 A2,如果存在符合条件的数字,则不输出 'N'if i == 1 and is_A2_no_N:continue# 否则输出 'N'results[i] = 'N'else:# 如果是 A4,格式化输出为一位小数if i == 3:results[i] = f"{results[i]:.1f}"# 打印最终结果
print(*results)

这段代码的目的是根据输入的一系列整数,分别计算并输出五个特定的结果(A1, A2, A3, A4, A5),这些结果根据数字对5的不同余数来分类计算。以下是详细的点评及复杂度分析:
代码优点
- 逻辑清晰:代码逻辑清晰地处理了不同的余数情况,分别对结果变量进行累加和统计。
- 注释详细:通过注释解释了每个步骤的作用,使代码更加易于理解。
- 边界情况处理:考虑了边界情况,例如,对于A2结果为0,而存在符合条件的A2数字时,不输出'N'。
代码缺点
- 可读性:虽然逻辑清晰,但变量名(如 is_A2_no_N、A2_flag)可以更具描述性,以增加可读性。
- 冗余判断:在最后一个循环中,对于results[i] == 0的判断有些冗余,因为A2的特殊处理可以在一个单独的步骤中完成。
时间复杂度
代码的时间复杂度主要分为两个部分:
- 输入读取:时间复杂度为 O(N),因为需要读取N个数字。
- 循环处理:时间复杂度为 O(N),因为对每个数字进行一次分类和计算。
因此,整个代码的时间复杂度为 O(N)。
空间复杂度
代码的空间复杂度主要分为以下部分:
- 输入数据存储:需要存储N个数字,空间复杂度为 O(N)。
- 结果变量:使用了固定数量的变量(A1, A2, A3, A4, A5,及一些辅助变量),空间复杂度为 O(1)。
因此,整个代码的空间复杂度为 O(N)。
代码改进建议
- 变量命名:可以使用更具描述性的变量名,例如 is_A2_no_N 可以改为 a2_has_valid_numbers,A2_flag 可以改为 a2_sign。
- 简化逻辑:可以将最后的特殊处理逻辑单独提取出来,以减少冗余判断。
我要更强
优化时间复杂度和空间复杂度的方法通常涉及减少不必要的计算和存储。对于这段代码,由于其已经具有线性时间复杂度(O(N))和线性空间复杂度(O(N)),进一步的优化可能不会显著改变这些复杂度,但可以提高代码的效率和可读性。以下是一些可能的优化方法:
- 减少重复计算:在循环中,如果某些计算是重复的,可以考虑将这些计算移出循环。
- 使用更高效的数据结构:如果需要频繁查找或更新数据,使用合适的数据结构可以提高效率。
- 避免不必要的类型转换:在处理数据时,尽量避免不必要的类型转换,因为这可能会增加时间开销。
由于这段代码的逻辑已经相对简单,且没有明显的重复计算或不必要的类型转换,因此直接的时间和空间优化可能有限。不过,我们可以通过改进代码结构和可读性来间接提高代码的效率。
以下是改进后的代码,虽然时间复杂度和空间复杂度没有变化,但代码结构更清晰,可读性更强:
# 读取输入,并分割成N和数字列表
N, *nums = map(int, input().split())# 初始化结果变量
A1 = A2 = A3 = A4 = A5 = 0
a2_has_valid_numbers = False # 标记是否存在符合A2条件的数字
a2_sign = 1 # A2的加减标志
A4_count = 0 # A4的计数器# 遍历数字列表,计算结果
for num in nums:if num % 5 == 0 and num % 2 == 0:A1 += numelif num % 5 == 1:a2_has_valid_numbers = TrueA2 += a2_sign * numa2_sign *= -1elif num % 5 == 2:A3 += 1elif num % 5 == 3:A4 += numA4_count += 1elif num % 5 == 4 and num > A5:A5 = num# 计算A4的平均值
if A4_count > 0:A4 = A4 / A4_count# 准备输出结果
results = []
for result in [A1, A2, A3, A4, A5]:if result == 0 and (results.index('A2') != 1 or not a2_has_valid_numbers):results.append('N')elif results.index('A4') == 3:results.append(f"{result:.1f}")else:results.append(result)# 输出结果
print(' '.join(map(str, results)))
这段代码的主要优化在于改进了代码的可读性和结构,使得逻辑更加清晰。时间复杂度和空间复杂度仍然保持为O(N),但通过改进代码结构,可以提高代码的维护性和可理解性,这在长期运行和维护中是非常重要的。
哲学和编程思想
这段代码的优化涉及几个重要的哲学和编程思想,包括:
-
KISS原则(Keep It Simple, Stupid):
- 这个原则强调保持代码的简单性。在优化代码时,我们尽量保持逻辑的清晰和简洁,避免过度复杂的结构。例如,通过简化变量名和逻辑判断,使代码更易于理解和维护。
-
DRY原则(Don't Repeat Yourself):
- DRY原则鼓励开发者避免重复的代码。虽然这段代码中没有明显的重复代码,但通过优化逻辑和结构,我们减少了不必要的判断和操作,间接地遵循了DRY原则。
-
抽象化:
- 通过抽象化,我们可以将复杂的逻辑简化为更容易管理的部分。在这段代码中,我们将处理不同条件下的数字的逻辑抽象为几个简单的if-elif语句,使得代码更加模块化和易于理解。
-
模块化编程:
- 模块化编程是将程序分解为多个独立模块的思想。虽然这段代码没有明显的模块化结构,但通过将不同的计算逻辑分离到不同的变量和条件语句中,我们实际上是在进行一种简单的模块化。
-
优化算法和数据结构:
- 虽然这段代码的时间复杂度和空间复杂度已经是O(N),但通过选择合适的数据结构(如使用列表来存储结果)和算法(如直接在循环中处理数据而不是在循环后处理),我们可以提高代码的效率。
-
可读性和可维护性:
- 在编程中,可读性和可维护性是非常重要的。通过改进变量名、简化逻辑和增加注释,我们提高了代码的可读性,使得其他开发者更容易理解和维护这段代码。
-
测试和调试:
- 在优化代码时,我们通常会考虑如何使代码更容易测试和调试。通过保持代码的简单性和清晰性,我们可以更容易地定位和修复潜在的问题。
这些哲学和编程思想不仅适用于这段代码的优化,也是软件开发中的通用原则。通过应用这些原则,可以创建出更高效、更可靠和更易于维护的软件。
举一反三
根据上述提到的哲学和编程思想,以下是一些实用的技巧和建议,可以帮助你在编程中举一反三,提高代码质量和效率:
-
保持代码简洁:
- 使用清晰的变量名和函数名。
- 避免不必要的复杂逻辑,尽量使用简单的控制结构。
- 使用注释来解释复杂的逻辑或重要的决策点。
-
避免重复代码:
- 识别并提取重复的代码块为函数或方法。
- 使用模板方法或策略模式来封装可变的行为。
- 使用配置文件或环境变量来管理可变的参数,而不是硬编码。
-
抽象化:
- 将复杂的逻辑分解为小的、可管理的部分。
- 使用类和对象来封装数据和操作。
- 使用接口或抽象类来定义通用的行为,以便不同的实现可以互换。
-
模块化编程:
- 将代码分解为独立的模块或包,每个模块负责一个特定的功能。
- 使用依赖注入来管理模块间的依赖关系。
- 使用版本控制系统来管理模块的变更历史。
-
优化算法和数据结构:
- 了解不同数据结构和算法的优缺点,根据问题的特点选择合适的工具。
- 使用缓存和记忆化技术来避免重复计算。
- 使用并行和并发技术来提高性能。
-
提高可读性和可维护性:
- 使用一致的代码风格和格式。
- 编写单元测试来验证代码的正确性。
- 定期进行代码审查,以发现潜在的问题和改进点。
-
测试和调试:
- 使用断言和日志来帮助调试。
- 编写集成测试和端到端测试来验证系统的整体行为。
- 使用版本控制系统的分支和标签来管理不同的开发和发布阶段。
通过将这些技巧应用到你的日常编程实践中,可以提高代码的质量,减少错误,并提高开发效率。记住,编程不仅仅是写代码,更是一种解决问题和创造价值的过程。
相关文章:
每日一题——Python实现PAT乙级1012 数字分类(举一反三+思想解读+逐步优化)五千字好文
一个认为一切根源都是“自己不够强”的INTJ 个人主页:用哲学编程-CSDN博客专栏:每日一题——举一反三Python编程学习Python内置函数 Python-3.12.0文档解读 目录 我的写法 代码优点 代码缺点 时间复杂度 空间复杂度 代码改进建议 我要更强 哲…...
Unity2D游戏制作入门 | 13 ( 之人物三段攻击 )
上期链接:Unity2D游戏制作入门 | 12(之人物受伤和死亡的逻辑动画)-CSDN博客 上期我们聊了人物的受伤和死亡的逻辑和动画,我们主要学习了事件的执行,即我们在人物受伤时可能会触发很多的事件,比如触发人物受伤的动画以及播放音乐等…...
DAY04 HTMLCSS
文章目录 一 表单(1) 数字控件(2) 颜色控件(3) 日期控件(4) 月份控件(5) 星期控件(6) 搜索控件(7) 范围控件 二 浮动框架三 结构化标签四 CSS1 CSS概述2 CSS的编写位置1. inline style 行内样式2. inner style 内部样式3. outer style 外部样式4. 小结 3 CSS选择器1. 通用选择器…...
Linux_理解程序地址空间和页表
目录 1、进程地址空间示意图 2、验证进程地址空间的结构 3、验证进程地址空间是虚拟地址 4、页表-虚拟地址与物理地址 5、什么是进程地址空间 6、进程地址空间和页表的存在意义 6.1 原因一(效率性) 6.2 原因二(安全性) …...
NAND闪存市场彻底复苏
在全球内存市场逐渐走出阴霾、迎来复苏曙光之际,日本存储巨头铠侠(Kioxia)凭借敏锐的市场洞察力和及时的战略调整,成功实现了从生产紧缩到全面复苏的华丽转身。这一转变不仅彰显了企业在逆境中的生存智慧,也为全球半导…...
过拟合与正则化
Location Beijing 过拟合 对于一个模型 A A A,解向量空间为 θ \theta θ,误差函数用式1表示 J ( θ ) J a c c [ y θ ( x ) − y ] 2 (1) J(\theta)J_{acc}[y_\theta(x)-y]^2\tag{1} J(θ)Jacc[yθ(x)−y]2(1) 首先我们考虑用模型 A A A拟合下…...
VMware挂载NAS存储异常处理
问题概述 由于非法关机或恢复,NFS存储可能会出现以下问题: 数据存储处于挂起状态或无法正常识别。虚拟机的配置文件或虚拟磁盘仍然注册在异常数据存储上。系统误认为有虚拟机在使用该数据存储。 问题对策 下面是详细的排查步骤和解决对策:…...
Redis 7.x 系列【4】命令手册
有道无术,术尚可求,有术无道,止于术。 本系列Redis 版本 7.2.5 源码地址:https://gitee.com/pearl-organization/study-redis-demo 文章目录 1. 说明2. 命令手册2.1 Generic2.2 数据类型2.2.1 String2.2.2 Hash2.2.3 List2.2.4 S…...
走进Elasticsearch
什么是ES 是一个分布式、RESTful风格的搜索和数据分析引擎 中文参考文档: 《Elasticsearch中文文档》 | Elasticsearch 技术论坛 elasticSearch官网: Functions and Operators | Elasticsearch Guide [7.11] | Elastic查询方式 Kibana查询(原…...
QT TCP服务器和客户端示例程序
下面是一个简单的 Qt TCP 服务器和客户端示例,演示了如何使用 vSetDriver、vSetListener 和 vTcpServerStart 函数。假设 vSetDriver 和 vSetListener 是你定义的自定义函数。 TCP 服务器部分 tcpserver.h #ifndef TCPSERVER_H #define TCPSERVER_H#include <QT…...
Xlua三方库Android编译出错解决办法
Xlua三方库Android编译出错解决办法 最近听老师的热更教程,讲到xlua编译android平台会报错,也是看了老师的博客,按照方法去解决,然而问题并没有解决。应该是因为代码更新或者版本不一样,在此简单记录一下解决过程。 参…...
美国犹他州立大学《Nature Geoscience》(IF=18)!揭示草本植物对土壤有机碳的重要贡献!
随着全球变暖的影响越来越显著,碳固定成为了一个备受关注的话题。在这个背景下,热带草原被认为是一个潜在的碳固定区域。然而,目前的研究主要关注于在热带草原中种植树木,以期望增加土壤有机碳含量。但是,热带草原中的…...
高考专业抉择计算机专业热度不减,兴趣、实力与挑战并存。
作为一名即将步入大学校门的高考生,我对于计算机相关专业是否仍是热门选择感到困惑。在过去几年里,计算机科学与技术、人工智能、网络安全、软件工程等专业一直备受追捧,吸引了无数学生。然而,随着市场竞争加剧和市场饱和度提高&a…...
Flask-RQ
Flask-RQ库教程 Flask-RQ 是一个用于在 Flask 应用中集成 RQ(Redis Queue)的扩展。RQ 是一个简单的 Python 库,用于将任务排入 Redis 队列并异步执行这些任务。这对于处理长时间运行的任务(如发送电子邮件、生成报告等࿰…...
LeetCode 58. 最后一个单词的长度
LeetCode 58. 最后一个单词的长度 你一个字符串 s,由若干单词组成,单词前后用一些空格字符隔开。返回字符串中 最后一个 单词的长度。 单词 是指仅由字母组成、不包含任何空格字符的最大子字符串 示例 1: 输入:s “Hello World”…...
3阶段提交协议(3pc)
3阶段提交协议(3pc) 1 简介 三阶段提交协议是一个强一致、中心化的原子提交协议。解决了分布式事务、副本容错等分布式问题。其核心思想是将2PC的二阶段提交协议的“准备阶段”一分为二,形成了由CanCommit、PreCommit、DoCommit三个阶段组成…...
802.11中的各种帧
在无线网络中,802.11协议定义了三种类型的帧:管理帧(Management Frames)、控制帧(Control Frames)和数据帧(Data Frames)。每种类型的帧都有其特定的功能,帮助维护和管理…...
SAP PP学习笔记21 - 计划策略的Customize:策略组 > 策略 > 需求类型 > 需求类(消费区分,计划区分)
上面几章讲了MTS,MTO,ATO的计划策略。 本章来讲一下它的后台 Customize。 1,Customizeing:Planned Indep.Reqmts Management 这是配置计划策略的整个过程: - Requirements Type / Class 需求类型 / 需求类 - Plann…...
axure9设置组件自适应浏览器大小
问题:预览时不展示下方的滚动条 方法一:转化为动态面板 1.在页面上创建一个矩形 2.右键-转化为动态面板 3.双击进入动态面板设置 4.设置动态面板矩形的颜色 5.删除原来的矩形 6.关闭动态面板,点击预览 7.此时可以发现底部没有滚动条了 方法…...
示例:WPF中TreeView自定义TreeNode泛型绑定对象来实现级联勾选
一、目的:在绑定TreeView的功能中经常会遇到需要在树节点前增加勾选CheckBox框,勾选本节点的同时也要同步显示父节点和子节点状态 二、实现 三、环境 VS2022 四、示例 定义如下节点类 public partial class TreeNodeBase<T> : SelectBindable<…...
【OSG学习笔记】Day 18: 碰撞检测与物理交互
物理引擎(Physics Engine) 物理引擎 是一种通过计算机模拟物理规律(如力学、碰撞、重力、流体动力学等)的软件工具或库。 它的核心目标是在虚拟环境中逼真地模拟物体的运动和交互,广泛应用于 游戏开发、动画制作、虚…...
CentOS下的分布式内存计算Spark环境部署
一、Spark 核心架构与应用场景 1.1 分布式计算引擎的核心优势 Spark 是基于内存的分布式计算框架,相比 MapReduce 具有以下核心优势: 内存计算:数据可常驻内存,迭代计算性能提升 10-100 倍(文档段落:3-79…...
跨链模式:多链互操作架构与性能扩展方案
跨链模式:多链互操作架构与性能扩展方案 ——构建下一代区块链互联网的技术基石 一、跨链架构的核心范式演进 1. 分层协议栈:模块化解耦设计 现代跨链系统采用分层协议栈实现灵活扩展(H2Cross架构): 适配层…...
学习STC51单片机31(芯片为STC89C52RCRC)OLED显示屏1
每日一言 生活的美好,总是藏在那些你咬牙坚持的日子里。 硬件:OLED 以后要用到OLED的时候找到这个文件 OLED的设备地址 SSD1306"SSD" 是品牌缩写,"1306" 是产品编号。 驱动 OLED 屏幕的 IIC 总线数据传输格式 示意图 …...
如何在网页里填写 PDF 表格?
有时候,你可能希望用户能在你的网站上填写 PDF 表单。然而,这件事并不简单,因为 PDF 并不是一种原生的网页格式。虽然浏览器可以显示 PDF 文件,但原生并不支持编辑或填写它们。更糟的是,如果你想收集表单数据ÿ…...
深度学习习题2
1.如果增加神经网络的宽度,精确度会增加到一个特定阈值后,便开始降低。造成这一现象的可能原因是什么? A、即使增加卷积核的数量,只有少部分的核会被用作预测 B、当卷积核数量增加时,神经网络的预测能力会降低 C、当卷…...
推荐 github 项目:GeminiImageApp(图片生成方向,可以做一定的素材)
推荐 github 项目:GeminiImageApp(图片生成方向,可以做一定的素材) 这个项目能干嘛? 使用 gemini 2.0 的 api 和 google 其他的 api 来做衍生处理 简化和优化了文生图和图生图的行为(我的最主要) 并且有一些目标检测和切割(我用不到) 视频和 imagefx 因为没 a…...
Netty从入门到进阶(二)
二、Netty入门 1. 概述 1.1 Netty是什么 Netty is an asynchronous event-driven network application framework for rapid development of maintainable high performance protocol servers & clients. Netty是一个异步的、基于事件驱动的网络应用框架,用于…...
CSS | transition 和 transform的用处和区别
省流总结: transform用于变换/变形,transition是动画控制器 transform 用来对元素进行变形,常见的操作如下,它是立即生效的样式变形属性。 旋转 rotate(角度deg)、平移 translateX(像素px)、缩放 scale(倍数)、倾斜 skewX(角度…...
【MATLAB代码】基于最大相关熵准则(MCC)的三维鲁棒卡尔曼滤波算法(MCC-KF),附源代码|订阅专栏后可直接查看
文章所述的代码实现了基于最大相关熵准则(MCC)的三维鲁棒卡尔曼滤波算法(MCC-KF),针对传感器观测数据中存在的脉冲型异常噪声问题,通过非线性加权机制提升滤波器的抗干扰能力。代码通过对比传统KF与MCC-KF在含异常值场景下的表现,验证了后者在状态估计鲁棒性方面的显著优…...
