当前位置: 首页 > news >正文

每日一题——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的不同余数来分类计算。以下是详细的点评及复杂度分析:

代码优点

  1. 逻辑清晰:代码逻辑清晰地处理了不同的余数情况,分别对结果变量进行累加和统计。
  2. 注释详细:通过注释解释了每个步骤的作用,使代码更加易于理解。
  3. 边界情况处理:考虑了边界情况,例如,对于A2结果为0,而存在符合条件的A2数字时,不输出'N'。

代码缺点

  1. 可读性:虽然逻辑清晰,但变量名(如 is_A2_no_N、A2_flag)可以更具描述性,以增加可读性。
  2. 冗余判断:在最后一个循环中,对于results[i] == 0的判断有些冗余,因为A2的特殊处理可以在一个单独的步骤中完成。

时间复杂度

代码的时间复杂度主要分为两个部分:

  1. 输入读取:时间复杂度为 O(N),因为需要读取N个数字。
  2. 循环处理:时间复杂度为 O(N),因为对每个数字进行一次分类和计算。

因此,整个代码的时间复杂度为 O(N)。

空间复杂度

代码的空间复杂度主要分为以下部分:

  1. 输入数据存储:需要存储N个数字,空间复杂度为 O(N)。
  2. 结果变量:使用了固定数量的变量(A1, A2, A3, A4, A5,及一些辅助变量),空间复杂度为 O(1)。

因此,整个代码的空间复杂度为 O(N)。

代码改进建议

  1. 变量命名:可以使用更具描述性的变量名,例如 is_A2_no_N 可以改为 a2_has_valid_numbers,A2_flag 可以改为 a2_sign。
  2. 简化逻辑:可以将最后的特殊处理逻辑单独提取出来,以减少冗余判断。

我要更强

优化时间复杂度和空间复杂度的方法通常涉及减少不必要的计算和存储。对于这段代码,由于其已经具有线性时间复杂度(O(N))和线性空间复杂度(O(N)),进一步的优化可能不会显著改变这些复杂度,但可以提高代码的效率和可读性。以下是一些可能的优化方法:

  1. 减少重复计算:在循环中,如果某些计算是重复的,可以考虑将这些计算移出循环。
  2. 使用更高效的数据结构:如果需要频繁查找或更新数据,使用合适的数据结构可以提高效率。
  3. 避免不必要的类型转换:在处理数据时,尽量避免不必要的类型转换,因为这可能会增加时间开销。

由于这段代码的逻辑已经相对简单,且没有明显的重复计算或不必要的类型转换,因此直接的时间和空间优化可能有限。不过,我们可以通过改进代码结构和可读性来间接提高代码的效率。

以下是改进后的代码,虽然时间复杂度和空间复杂度没有变化,但代码结构更清晰,可读性更强:

# 读取输入,并分割成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),但通过改进代码结构,可以提高代码的维护性和可理解性,这在长期运行和维护中是非常重要的。


哲学和编程思想

这段代码的优化涉及几个重要的哲学和编程思想,包括:

  1. KISS原则(Keep It Simple, Stupid):

    • 这个原则强调保持代码的简单性。在优化代码时,我们尽量保持逻辑的清晰和简洁,避免过度复杂的结构。例如,通过简化变量名和逻辑判断,使代码更易于理解和维护。
  2. DRY原则(Don't Repeat Yourself):

    • DRY原则鼓励开发者避免重复的代码。虽然这段代码中没有明显的重复代码,但通过优化逻辑和结构,我们减少了不必要的判断和操作,间接地遵循了DRY原则。
  3. 抽象化:

    • 通过抽象化,我们可以将复杂的逻辑简化为更容易管理的部分。在这段代码中,我们将处理不同条件下的数字的逻辑抽象为几个简单的if-elif语句,使得代码更加模块化和易于理解。
  4. 模块化编程:

    • 模块化编程是将程序分解为多个独立模块的思想。虽然这段代码没有明显的模块化结构,但通过将不同的计算逻辑分离到不同的变量和条件语句中,我们实际上是在进行一种简单的模块化。
  5. 优化算法和数据结构:

    • 虽然这段代码的时间复杂度和空间复杂度已经是O(N),但通过选择合适的数据结构(如使用列表来存储结果)和算法(如直接在循环中处理数据而不是在循环后处理),我们可以提高代码的效率。
  6. 可读性和可维护性:

    • 在编程中,可读性和可维护性是非常重要的。通过改进变量名、简化逻辑和增加注释,我们提高了代码的可读性,使得其他开发者更容易理解和维护这段代码。
  7. 测试和调试:

  • 在优化代码时,我们通常会考虑如何使代码更容易测试和调试。通过保持代码的简单性和清晰性,我们可以更容易地定位和修复潜在的问题。

这些哲学和编程思想不仅适用于这段代码的优化,也是软件开发中的通用原则。通过应用这些原则,可以创建出更高效、更可靠和更易于维护的软件。


举一反三

根据上述提到的哲学和编程思想,以下是一些实用的技巧和建议,可以帮助你在编程中举一反三,提高代码质量和效率:

  1. 保持代码简洁:

    • 使用清晰的变量名和函数名。
    • 避免不必要的复杂逻辑,尽量使用简单的控制结构。
    • 使用注释来解释复杂的逻辑或重要的决策点。
  2. 避免重复代码:

    • 识别并提取重复的代码块为函数或方法。
    • 使用模板方法或策略模式来封装可变的行为。
    • 使用配置文件或环境变量来管理可变的参数,而不是硬编码。
  3. 抽象化:

    • 将复杂的逻辑分解为小的、可管理的部分。
    • 使用类和对象来封装数据和操作。
    • 使用接口或抽象类来定义通用的行为,以便不同的实现可以互换。
  4. 模块化编程:

    • 将代码分解为独立的模块或包,每个模块负责一个特定的功能。
    • 使用依赖注入来管理模块间的依赖关系。
    • 使用版本控制系统来管理模块的变更历史。
  5. 优化算法和数据结构:

    • 了解不同数据结构和算法的优缺点,根据问题的特点选择合适的工具。
    • 使用缓存和记忆化技术来避免重复计算。
    • 使用并行和并发技术来提高性能。
  6. 提高可读性和可维护性:

    • 使用一致的代码风格和格式。
    • 编写单元测试来验证代码的正确性。
    • 定期进行代码审查,以发现潜在的问题和改进点。
  7. 测试和调试:

  • 使用断言和日志来帮助调试。
  • 编写集成测试和端到端测试来验证系统的整体行为。
  • 使用版本控制系统的分支和标签来管理不同的开发和发布阶段。

通过将这些技巧应用到你的日常编程实践中,可以提高代码的质量,减少错误,并提高开发效率。记住,编程不仅仅是写代码,更是一种解决问题和创造价值的过程。


相关文章:

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

一个认为一切根源都是“自己不够强”的INTJ 个人主页&#xff1a;用哲学编程-CSDN博客专栏&#xff1a;每日一题——举一反三Python编程学习Python内置函数 Python-3.12.0文档解读 目录 我的写法 代码优点 代码缺点 时间复杂度 空间复杂度 代码改进建议 我要更强 哲…...

Unity2D游戏制作入门 | 13 ( 之人物三段攻击 )

上期链接&#xff1a;Unity2D游戏制作入门 | 12(之人物受伤和死亡的逻辑动画)-CSDN博客 上期我们聊了人物的受伤和死亡的逻辑和动画&#xff0c;我们主要学习了事件的执行&#xff0c;即我们在人物受伤时可能会触发很多的事件&#xff0c;比如触发人物受伤的动画以及播放音乐等…...

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 原因一&#xff08;效率性&#xff09; 6.2 原因二&#xff08;安全性&#xff09; …...

NAND闪存市场彻底复苏

在全球内存市场逐渐走出阴霾、迎来复苏曙光之际&#xff0c;日本存储巨头铠侠&#xff08;Kioxia&#xff09;凭借敏锐的市场洞察力和及时的战略调整&#xff0c;成功实现了从生产紧缩到全面复苏的华丽转身。这一转变不仅彰显了企业在逆境中的生存智慧&#xff0c;也为全球半导…...

过拟合与正则化

Location Beijing 过拟合 对于一个模型 A A A&#xff0c;解向量空间为 θ \theta θ&#xff0c;误差函数用式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存储异常处理

问题概述 由于非法关机或恢复&#xff0c;NFS存储可能会出现以下问题&#xff1a; 数据存储处于挂起状态或无法正常识别。虚拟机的配置文件或虚拟磁盘仍然注册在异常数据存储上。系统误认为有虚拟机在使用该数据存储。 问题对策 下面是详细的排查步骤和解决对策&#xff1a…...

Redis 7.x 系列【4】命令手册

有道无术&#xff0c;术尚可求&#xff0c;有术无道&#xff0c;止于术。 本系列Redis 版本 7.2.5 源码地址&#xff1a;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风格的搜索和数据分析引擎 中文参考文档&#xff1a; 《Elasticsearch中文文档》 | Elasticsearch 技术论坛 elasticSearch官网&#xff1a; Functions and Operators | Elasticsearch Guide [7.11] | Elastic查询方式 Kibana查询&#xff08;原…...

QT TCP服务器和客户端示例程序

下面是一个简单的 Qt TCP 服务器和客户端示例&#xff0c;演示了如何使用 vSetDriver、vSetListener 和 vTcpServerStart 函数。假设 vSetDriver 和 vSetListener 是你定义的自定义函数。 TCP 服务器部分 tcpserver.h #ifndef TCPSERVER_H #define TCPSERVER_H#include <QT…...

Xlua三方库Android编译出错解决办法

Xlua三方库Android编译出错解决办法 最近听老师的热更教程&#xff0c;讲到xlua编译android平台会报错&#xff0c;也是看了老师的博客&#xff0c;按照方法去解决&#xff0c;然而问题并没有解决。应该是因为代码更新或者版本不一样&#xff0c;在此简单记录一下解决过程。 参…...

美国犹他州立大学《Nature Geoscience》(IF=18)!揭示草本植物对土壤有机碳的重要贡献!

随着全球变暖的影响越来越显著&#xff0c;碳固定成为了一个备受关注的话题。在这个背景下&#xff0c;热带草原被认为是一个潜在的碳固定区域。然而&#xff0c;目前的研究主要关注于在热带草原中种植树木&#xff0c;以期望增加土壤有机碳含量。但是&#xff0c;热带草原中的…...

高考专业抉择计算机专业热度不减,兴趣、实力与挑战并存。

作为一名即将步入大学校门的高考生&#xff0c;我对于计算机相关专业是否仍是热门选择感到困惑。在过去几年里&#xff0c;计算机科学与技术、人工智能、网络安全、软件工程等专业一直备受追捧&#xff0c;吸引了无数学生。然而&#xff0c;随着市场竞争加剧和市场饱和度提高&a…...

Flask-RQ

Flask-RQ库教程 Flask-RQ 是一个用于在 Flask 应用中集成 RQ&#xff08;Redis Queue&#xff09;的扩展。RQ 是一个简单的 Python 库&#xff0c;用于将任务排入 Redis 队列并异步执行这些任务。这对于处理长时间运行的任务&#xff08;如发送电子邮件、生成报告等&#xff0…...

LeetCode 58. 最后一个单词的长度

LeetCode 58. 最后一个单词的长度 你一个字符串 s&#xff0c;由若干单词组成&#xff0c;单词前后用一些空格字符隔开。返回字符串中 最后一个 单词的长度。 单词 是指仅由字母组成、不包含任何空格字符的最大子字符串 示例 1&#xff1a; 输入&#xff1a;s “Hello World”…...

3阶段提交协议(3pc)

3阶段提交协议&#xff08;3pc&#xff09; 1 简介 三阶段提交协议是一个强一致、中心化的原子提交协议。解决了分布式事务、副本容错等分布式问题。其核心思想是将2PC的二阶段提交协议的“准备阶段”一分为二&#xff0c;形成了由CanCommit、PreCommit、DoCommit三个阶段组成…...

802.11中的各种帧

在无线网络中&#xff0c;802.11协议定义了三种类型的帧&#xff1a;管理帧&#xff08;Management Frames&#xff09;、控制帧&#xff08;Control Frames&#xff09;和数据帧&#xff08;Data Frames&#xff09;。每种类型的帧都有其特定的功能&#xff0c;帮助维护和管理…...

SAP PP学习笔记21 - 计划策略的Customize:策略组 > 策略 > 需求类型 > 需求类(消费区分,计划区分)

上面几章讲了MTS&#xff0c;MTO&#xff0c;ATO的计划策略。 本章来讲一下它的后台 Customize。 1&#xff0c;Customizeing&#xff1a;Planned Indep.Reqmts Management 这是配置计划策略的整个过程&#xff1a; - Requirements Type / Class 需求类型 / 需求类 - Plann…...

axure9设置组件自适应浏览器大小

问题&#xff1a;预览时不展示下方的滚动条 方法一&#xff1a;转化为动态面板 1.在页面上创建一个矩形 2.右键-转化为动态面板 3.双击进入动态面板设置 4.设置动态面板矩形的颜色 5.删除原来的矩形 6.关闭动态面板&#xff0c;点击预览 7.此时可以发现底部没有滚动条了 方法…...

示例:WPF中TreeView自定义TreeNode泛型绑定对象来实现级联勾选

一、目的&#xff1a;在绑定TreeView的功能中经常会遇到需要在树节点前增加勾选CheckBox框&#xff0c;勾选本节点的同时也要同步显示父节点和子节点状态 二、实现 三、环境 VS2022 四、示例 定义如下节点类 public partial class TreeNodeBase<T> : SelectBindable<…...

C++ explicit关键字的用法

在C中&#xff0c;explicit关键字用于构造函数和转换运算符&#xff0c;以防止隐式转换。它可以帮助我们避免意外的类型转换&#xff0c;从而提高代码的安全性和可读性。explicit关键字只能用于单参数构造函数和转换运算符。 使用explicit的场景 单参数构造函数&#xff1a; 当…...

51.Python-web框架-Django开始第一个应用的增删改查

目录 1.概述 2.创建应用 创建app01 在settings.py里引用app01 3.定义模型 在app01\models.py里创建模型 数据库迁移 4.创建视图 引用头 部门列表视图 部门添加视图 部门编辑视图 部门删除视图 5.创建Template 在app01下创建目录templates 部门列表模板depart.ht…...

Redis之线程IO模型

引言 Redis是个单线程程序&#xff01;这点必须铭记。除了Redis之外&#xff0c;Node.js也是单线程&#xff0c;Nginx也是单线程&#xff0c;但是他们都是服务器高性能的典范。 Redis单线程为什么能够这么快&#xff01; 因为他所有的数据都在内存中&#xff0c;所有的运算都…...

针对微电网中可时移,柔性,基础负荷的电价响应模型---代码解析

前言&#xff1a; 在上两篇帖子中&#xff0c;讲解了我对于粒子群算法的理解&#xff0c;站在巨人的肩膀上去回望&#xff1a;科研前辈们确实非常牛逼&#xff0c;所以它才成为了非常经典的算法。这篇帖子主要是想分享一下&#xff0c;对于微电网、电力系统的论文中&#xff0c…...

git使用http协议时免密pull和push方法

1、创建文件 在项目目录下创建.git-credentials文件&#xff0c;内容如下&#xff0c;填入自己的用户名和密码即可&#xff0c;如果是gitlab&#xff0c;把地址换成自己的gitlab的地址即可。 https://{用户名}:{密码}github.com2、终端执行 git config --global credential.…...

编译期间生成代码(Lombok原理)

通过在编译期间&#xff0c;修改Java的AST(Abstract Syntax Tree)树&#xff0c;可以往类中&#xff0c;添加/修改&#xff08;覆盖&#xff09;方法、属性等。 现在比较常见的三方依赖例子有&#xff1a;Lobbok的Data可以生成get、set方法&#xff0c;Sl4j2可以生成静态常量l…...

第2讲:pixi.js 绘制HelloWorld

基于第0讲和第1讲&#xff0c;我们增添了vite.config.ts文件。并配置了其他的http端口。 此时&#xff0c;我们删除掉没用的东西。 删除 conter.ts、typescript.svg 在main.ts中改成如下内容&#xff1a; import {Application, Text} from pixi.js import ./style.css// 指明…...

golang HTTP2 https测试POST变GET问题小记

概述 因为工作需要协助修改某个golang程序&#xff0c;添加双向认证。但是在调整的过程遇到一个HTTP POST请求变成GET诡异的问题&#xff0c;最后各种搜索&#xff0c;总算解决&#xff0c;博文记录&#xff0c;用于备忘。 代码 服务端 因工作内容&#xff0c;代码有删减&a…...

Linux下的lvm镜像与快照

lvm镜像(mirror) (1)划分三个PV&#xff0c;其中2个PV大小要一模一样 Disk /dev/sdb: 21.5 GB, 21474836480 bytes 255 heads, 63 sectors/track, 2610 cylinders Units cylinders of 16065 * 512 8225280 bytes Sector size (logical/physical): 512 bytes / 512 bytes I/…...

嵌入式linux系统中SPI子系统原理分析01

大家好,今天给大家分享一下,如何使用linux系统中的SPI通信协议,实现主从设备之间的信息传递。 SPI是一种常见的设备通用通信协议。它是一个独特优势就是可以无中断发送数据,可以连续发送或接收任意数量的位。而在I2C和UART中,数据以数据包的形式发送,有限定位数。 …...

网站要跟换域名怎么做/aso优化工具

只接收一个List作为入参的话不报错&#xff0c;下方为代码&#xff1a;前台&#xff1a;$.ajax({type:"post",url: add,contentType:"application/json; charsetutf-8",dataType:"json",data:JSON.stringify([{id:1,name:"hello"},{id…...

个人网站做电影资源链接犯法吗/如何自己做引流推广

TcaplusDB君一直密切关注着游戏行业和数据库行业的动态。以下是五月份TcaplusDB君收集的近期的游戏行业和数据库行业的新闻&#xff0c;汇编整理&#xff0c;献给大家观看。 &#xff08;本篇文章部分内容来自网络&#xff09; 日本周销量2022.4.4&#xff5e;4.10《星之卡比 …...

wordpress如何安装模板文件夹/简述网站建设的流程

openvino_datawhale https://aiedge.datawhale.club/page/2935608?navIndex0...

前端网站模板/推广引流方法有哪些推广方法

1 Region拆分 一个Region代表一个表的一段Rowkey的数据集合&#xff0c;当Region太大&#xff0c;Master会将其拆分。Region太大会导致读取效率太低&#xff0c;遍历时间太长&#xff0c;通过将大数据拆分到不同机器上&#xff0c;分别查询再聚合&#xff0c;Hbase也被人称为“…...

网站建设/seo技术306

原文&#xff1a;http://www.asp.net/mvc/tutorials/getting-started-with-ef-using-mvc/creating-an-entity-framework-data-model-for-an-asp-net-mvc-application 【序】 Contoso大学示例程序为您演示了如何使用EntityFramework技术来创建一个完整的ASP.NET MVC程序&#xf…...

怎么建免费网站/免费推广软件工具

注册全局组件 定义一个全局的组件的方法&#xff1a; Vue.component("submission-component",{//options }) 定义一个节点级别的组件 const submissionComponent{//组件的声明 }new Vue({//在此处注册组件 }) 创建组件的实例 //单行创建组件const submissionCompone…...