每日一题——Python实现PAT乙级1059 C语言竞赛(举一反三+思想解读+逐步优化)四千字好文


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

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

Python-3.12.0文档解读

目录

我的写法

时间复杂度分析

空间复杂度分析

代码优化建议

总结

我要更强

优化方法

优化后的代码

代码解释

时间复杂度分析

空间复杂度分析

总结

哲学和编程思想

抽象与封装:

效率与优化:

简洁与清晰:

不变性与可变性:

DRY原则(Don't Repeat Yourself):

KISS原则(Keep It Simple, Stupid):

YAGNI原则(You Ain't Gonna Need It):

单一职责原则(Single Responsibility Principle):

开闭原则(Open/Closed Principle):


题目链接:https://pintia.cn/problem-sets/994805260223102976/exam/problems/type/7?problemSetProblemId=994805269828059136&page=0

我的写法

import mathdef is_prime(num):if num == 2:return Trueelif num % 2 == 0 or num < 2:return Falseelse:for i in range(3, math.isqrt(num) + 1, 2):if num % i == 0:return Falsereturn TrueN = int(input())
tops = [int(input()) for _ in range(N)]
K = int(input())
ids = [int(input()) for _ in range(K)]# 使用字典存储排名信息
rank_dict = {top: i + 1 for i, top in enumerate(tops)}already_got = {top: 0 for top in tops}
if_has = {top: 1 for top in tops}for i in range(K):current_id = ids[i]print(f"{str(current_id).zfill(4)}: ", end='')if current_id not in if_has:print("Are you kidding?")elif already_got[current_id] == 1:print("Checked")elif rank_dict[current_id] == 1:already_got[current_id] = 1print("Mystery Award")elif is_prime(rank_dict[current_id]):already_got[current_id] = 1print("Minion")else:already_got[current_id] = 1print("Chocolate")

这段代码的主要功能是根据输入的排名列表和查询ID列表,输出每个查询ID对应的奖励类型。代码的逻辑如下:

  1. 输入处理:读取排名列表和查询ID列表。
  2. 字典初始化:使用字典存储排名信息和查询状态。
  3. 查询处理:根据查询ID输出对应的奖励类型。

时间复杂度分析

  1. 输入处理:读取排名列表和查询ID列表的时间复杂度是 O(N + K),其中 N 是排名列表的长度,K 是查询ID列表的长度。
  2. 字典初始化:使用字典推导式初始化 rank_dict、already_got 和 if_has 的时间复杂度是 O(N)。
  3. 查询处理:对于每个查询ID,检查其是否在 if_has 字典中,以及更新 already_got 字典的状态。这些操作的时间复杂度是 O(1)。因此,整个查询处理的时间复杂度是 O(K)。

综合来看,整个代码的时间复杂度是 O(N + K)。

空间复杂度分析

  1. 输入存储:排名列表和查询ID列表的空间复杂度是 O(N + K)。
  2. 字典存储:rank_dict、already_got 和 if_has 字典的空间复杂度是 O(N)。

综合来看,整个代码的空间复杂度是 O(N + K)。

代码优化建议

  1. 输入处理:确保输入的格式和类型是正确的。
  2. 字典初始化:使用字典推导式初始化字典时,确保键和值的类型是正确的。
  3. 索引处理:在检查排名时,使用字典来存储排名信息,避免使用 index 方法,提高性能。
  4. 输出格式:确保输出的格式是正确的。

总结

这段代码在逻辑上是正确的,时间复杂度为 O(N + K),空间复杂度为 O(N + K)。通过使用字典来存储排名信息,避免了使用 index 方法,提高了性能。整体来说,代码是高效的,并且易于理解和维护。


我要更强

优化时间复杂度和空间复杂度的方法通常包括减少不必要的计算、使用更高效的数据结构、以及避免重复计算。以下是一些可能的优化方法,并附上相应的代码和注释。

优化方法

  1. 避免重复计算:使用缓存或记忆化技术来存储已经计算过的结果。
  2. 高效数据结构:使用集合(set)来快速检查元素是否存在。
  3. 减少不必要的字典:合并一些字典,减少空间占用。

优化后的代码

import mathdef is_prime(num):if num == 2:return Trueelif num % 2 == 0 or num < 2:return Falseelse:for i in range(3, math.isqrt(num) + 1, 2):if num % i == 0:return Falsereturn TrueN = int(input())
tops = [int(input()) for _ in range(N)]
K = int(input())
ids = [int(input()) for _ in range(K)]# 使用字典存储排名信息和查询状态
rank_dict = {top: i + 1 for i, top in enumerate(tops)}
already_got = set()# 使用集合存储有效的ID,以加快查找速度
valid_ids = set(tops)for current_id in ids:print(f"{str(current_id).zfill(4)}: ", end='')if current_id not in valid_ids:print("Are you kidding?")elif current_id in already_got:print("Checked")else:rank = rank_dict[current_id]if rank == 1:print("Mystery Award")elif is_prime(rank):print("Minion")else:print("Chocolate")already_got.add(current_id)

代码解释

  1. 输入处理:读取排名列表和查询ID列表。
  2. 字典初始化:使用字典推导式初始化 rank_dict,使用集合 valid_ids 存储有效的ID。
  3. 查询处理:使用集合 already_got 来记录已经查询过的ID,避免重复计算。

时间复杂度分析

  1. 输入处理:O(N + K)。
  2. 字典和集合初始化:O(N)。
  3. 查询处理:每个查询ID的检查时间复杂度是 O(1),因此总的时间复杂度是 O(K)。

综合来看,整个代码的时间复杂度是 O(N + K)。

空间复杂度分析

  1. 输入存储:O(N + K)。
  2. 字典和集合存储:O(N)。

综合来看,整个代码的空间复杂度是 O(N + K)。

总结

通过使用集合来存储有效的ID和已经查询过的ID,减少了不必要的字典,提高了查找速度。整体代码的时间复杂度和空间复杂度仍然是 O(N + K),但在实际运行中,由于集合的高效查找特性,性能会有所提升。


哲学和编程思想

这些优化方法体现了多个哲学和编程思想,具体包括:

  1. 抽象与封装:

    • 抽象:将问题分解为更小的、可管理的部分,例如将输入处理、字典初始化和查询处理分开。
    • 封装:将功能封装在函数中,例如 is_prime 函数,使得代码更模块化和可重用。
  2. 效率与优化:

    • 效率:通过使用集合(set)来快速检查元素是否存在,提高了查找效率。
    • 优化:避免重复计算,例如使用 already_got 集合来记录已经查询过的ID,避免重复处理。
  3. 简洁与清晰:

    • 简洁:使用字典推导式和集合来简化代码,减少冗余。
    • 清晰:代码结构清晰,易于理解和维护。
  4. 不变性与可变性:

    • 不变性:尽量使用不可变数据结构,例如集合(set),以减少副作用和提高代码的稳定性。
    • 可变性:在必要时使用可变数据结构,例如 already_got 集合,以记录状态变化。
  5. DRY原则(Don't Repeat Yourself):

    • 避免重复代码,例如通过使用集合来统一处理ID的检查和记录。
  6. KISS原则(Keep It Simple, Stupid):

    • 保持代码简单,避免过度设计,例如使用简单的数据结构和直接的逻辑处理。
  7. YAGNI原则(You Ain't Gonna Need It):

    • 仅实现当前需要的功能,避免过度工程化,例如不预先设计复杂的数据结构,而是根据实际需求逐步优化。
  8. 单一职责原则(Single Responsibility Principle):

    • 每个函数或模块只负责一个功能,例如 is_prime 函数只负责判断素数,rank_dict 只负责存储排名信息。
  9. 开闭原则(Open/Closed Principle):

  • 对扩展开放,对修改关闭。例如,如果需要增加新的奖励类型,只需修改奖励类型的判断逻辑,而不需要修改整体的查询处理流程。

通过这些哲学和编程思想的应用,代码不仅在性能上得到了优化,而且在可读性、可维护性和扩展性上也得到了提升。


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

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

相关文章

.NET周刊【6月第4期 2024-06-23】

国内文章 C#.Net筑基-集合知识全解 https://www.cnblogs.com/anding/p/18229596 .Net中提供了数组、列表、字典等多种集合类型&#xff0c;分为泛型和非泛型集合。泛型集合具有更好的性能和类型安全性。集合的基础接口包括IEnumerator、IEnumerable、ICollection、IList、ID…

Gradio 4.37.1官方教程二:Blocks

文章目录 一、Blocks及事件监听器1.1 Blocks结构1.2 事件监听器的类型1.3 多数据流1.4 多输入组件1.5 多输出组件1.6 更新组件配置1.7 添加示例1.8 连续运行事件1.9 持续运行事件1.9.1 every参数1.9.2 load方法1.9.3 change方法 1.10 收集事件数据1.11 绑定多个触发器到同一函数…

基于线调频小波变换的一维时间序列时频分析方法(MATLAB)

在机械故障诊断领域,振动信号的处理常采用以快速傅立叶变换为基础的相关分析、幅值分析、频谱分析等时域和频域分析方法。但经典的FFT存在固有缺点,即它虽然在频域范围内是完全局部化的,但是它不包含任何时域信息,因而不适于分析非平稳信号。近年来涌现的各种时频分析方法(短时…

【刷题】初步认识深搜(DFS)

送给大家一句话&#xff1a; 拥有希望的人&#xff0c;和漫天的星星一样&#xff0c;是永远不会孤独的。 -- 《星游记》 初步认识深搜&#xff08;DFS&#xff09; dfs算法二叉树中的深搜Leetcode 129. 求根节点到叶节点数字之和题目描述算法思路 Leetcode 814. 二叉树剪枝题…

Redis-实战篇-缓存更新策略(内存淘汰、超时剔除、主动更新)

文章目录 1、缓存更新策略1.1、内存淘汰1.2、超时剔除1.3、主动更新 2、业务场景&#xff1a;3、主动更新在企业中业务实现有三种方式3.1、Cache Aside Pattern3.1.1、操作缓存和数据库时有三个问题需要考虑&#xff1a;3.1.1.1、删除缓存还是更新缓存&#xff1f;3.1.1.2、如何…

数据同步软件有哪些

数据同步软件有哪些呢&#xff1f;随着企业规模的扩大&#xff0c;企业数据也积累得越来越多&#xff0c;万一发生宕机风险&#xff0c;那么这个损失将不可估量。所以为了容灾备用&#xff0c;我们往往需要将数据同步到另一台备胎服务器上&#xff0c;进行冗余。 那么需要同步的…

centos7.9 python3环境(virtualenv)搭建及所遇错误

人望山&#xff0c;鱼窥荷&#xff0c;真正喜欢想要的&#xff0c;没有一样可以轻易得到。 目录 # 1. 解决版本冲突问题--建议不要跳过(一定要查看软链接是否链接正确) # 2. python3(virtualenv)环境搭建 # 3. virtualenv常用命令 # 4. 所遇错误解析 ## 4.1 遇到 No modul…

惠海 H6246低功耗DC/DC降压型恒压芯片60V降3.3V5V12V 蓝牙模块 单片机供电

1.产品描述 H6246是一种内置60V耐压MOS&#xff0c;支持输入高达48V的高压降压开关控制器&#xff0c;可以向负载提供0.3A的连续电流。H6246支持输出恒定电压&#xff0c;可以通过调节VFB采样电阻来设置输出电压&#xff0c;同时支持最大电流限制&#xff0c;可以通过修改CS采…

操作系统期末复习考题二

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 一、前言&#x1f680;&#x1f680;&#x1f680;二、正文☀️☀️☀️三、总结&#x1f353;&#x1f353;&#x1f353; 一、前言&#x1f680;&#x1f680;&am…

【资源调度】1-何为调度?

导读&#xff1a;本期是全网最全【资源调度】系列推文的第1期(共50期左右)。我们将对调度的定义与作用、计划与调度的关系、调度问题的拆解做出详细介绍&#xff0c;使大家对【资源调度】问题有了一个整体的认识&#xff0c;为后续的内容奠定基础。 作者1&#xff1a;张哲铭&am…

个人搭建cppreference网站

近日,由于购买的腾讯云服务器要过期了,之前在服务器搭建的cppreference也要重新搭建,故写下此文章 cppreference的访问速度也慢,故自己WSL子系统简单搭键一下是个不错的选择 环境准备 首先,自己先安装Nginx,在网上找安装教程即可下载cppreference网站资源包:https://pan.baidu…

RFID固定资产管理系统在企业中的应用与优势

随着企业资产规模的不断扩大和管理复杂性的增加&#xff0c;传统的资产管理方式已无法满足企业高效管理的需求。RFID固定资产管理系统凭借其高效、准确、实时的特点&#xff0c;成为企业固定资产管理的新宠。 一、什么是RFID固定资产管理系统 RFID&#xff08;无线射频识别&…

使用AI工具 Baidu Comate 辅助编码 快速定位修改Bug

一、Baidu Comate 概述 Baidu Comate&#xff08;百度智能编码助手&#xff09;是一款基于文心大模型的新一代编码辅助工具。它结合了百度多年积累的编程现场大数据和外部优秀开源数据&#xff0c;旨在为用户提供高质量的编程代码生成和优化服务。Comate的主要目标是提升编码效…

帮助某服务业公司制定发展战略与未来规划

在集团公司高速发展、业务范围不断扩大时&#xff0c;组织往往对公司未来的发展方向感到迷茫&#xff0c;不知道如何进行更好的规划&#xff0c;找到合适的发展战略&#xff0c;为企业提供更长远的发展空间&#xff0c;带来更多是利益。面对这个问题&#xff0c;华恒智信认为企…

AXI接口简介

AXI接口&#xff0c;全称为Advanced eXtensible Interface&#xff0c;是ARM公司推出的一种高性能、低成本、可扩展的高速总线接口。AXI接口是ARM公司提出的AMBA&#xff08;Advanced Microcontroller Bus Architecture&#xff09;高级微控制器总线架构的一部分。2003年发布了…

RK3568平台(USB篇)UVC驱动分析

一.UVC简介 摄像头分为两类&#xff1a; 1.CAMER接口的摄像头&#xff1b; 2.USB接口接口的摄像头&#xff1b; 这里主要介绍usb摄像头的设备驱动程序。 UVC全称为USB Video Class&#xff0c;即&#xff1a;USB视频类&#xff0c;是一种为USB视频捕获设备定义的协议标准。…

详解ApplicationRunner和CommandLineRunner

一、前言 springBoot框架项目&#xff0c;有时候有预加载数据需求——提前加载到缓存中或类的属性中&#xff0c;并且希望执行操作的时间是在容器启动末尾时间执行操作。比如笔者工作中遇到了一个预加载redis中的缓存数据&#xff0c;加载为java对象。针对这种场景&#xff0c…

调试解析直播弹幕消息protobuf内容,一步一步教你debug查看PushFrame和Response解码在哪里

我们知道直播间的弹幕消息是通过websocket传输的&#xff0c;而且传输的并不是明文数据&#xff0c;而是protobuf消息&#xff0c;至于为什么使用这个protobuf消息&#xff0c;因为它是二进制传输&#xff0c;更快更稳&#xff0c;相对于直播这种实时性比较高的要求&#xff0c…

Profibus协议转profinet协议网关模块连接电机保护器与PLC通讯

一、背景 工业通讯中常见的协议有&#xff1a;Modbus协议&#xff0c;ModbusTCP协议&#xff0c;Profinet协议&#xff0c;Profibus协议&#xff0c;Profibus DP协议&#xff0c;EtherCAT协议&#xff0c;EtherNET协议等在现代工业控制系统中具有重要的角色。而Profibus协议转…

Horror病毒原理和解析【附靶场+网安学习视频】

Windows XP Horror Edition&#xff1a;这是一种伪装成Windows XP更新的应用程序&#xff0c;实际上会安装恶意软件。一旦运行&#xff0c;它会显示一个假更新&#xff0c;完成后屏幕会显示各种恐怖效果和文字。这个程序会更改桌面背景、图标和系统设置&#xff0c;甚至尝试重写…