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

news2024/11/24 4:41:50


一个认为一切根源都是“自己不够强”的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 math

def is_prime(num):
    if num == 2:
        return True
    elif num % 2 == 0 or num < 2:
        return False
    else:
        for i in range(3, math.isqrt(num) + 1, 2):
            if num % i == 0:
                return False
        return True

N = 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] = 1
        print("Mystery Award")
    elif is_prime(rank_dict[current_id]):
        already_got[current_id] = 1
        print("Minion")
    else:
        already_got[current_id] = 1
        print("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 math

def is_prime(num):
    if num == 2:
        return True
    elif num % 2 == 0 or num < 2:
        return False
    else:
        for i in range(3, math.isqrt(num) + 1, 2):
            if num % i == 0:
                return False
        return True

N = 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.coloradmin.cn/o/1876664.html

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

相关文章

fastadmin selectpage下拉框默认选中

修改 /public/assets/libs/fastadmin-selectpage/selectpage.js

C++【引用】

P. S.&#xff1a;以下代码均在VS2019环境下测试&#xff0c;不代表所有编译器均可通过。 P. S.&#xff1a;测试代码均未展示头文件stdio.h的声明&#xff0c;使用时请自行添加。 博主主页&#xff1a;LiUEEEEE                        …

入门Java爬虫:认识其基本概念和应用方法

Java爬虫初探&#xff1a;了解它的基本概念与用途&#xff0c;需要具体代码示例 随着互联网的快速发展&#xff0c;获取并处理大量的数据成为企业和个人不可或缺的一项任务。而爬虫&#xff08;Web Scraping&#xff09;作为一种自动化的数据获取方法&#xff0c;不仅能够快速…

【数据分析】1、用Pandas计算数据相关性系数

相关性系数和相关分析是了解变量之间关系的重要工具。通过合理选择相关性系数和科学分析数据&#xff0c;能够有效揭示变量之间的关系&#xff0c;为进一步研究和决策提供有力支持。在实际应用中&#xff0c;应结合业务背景、数据特性和统计原则&#xff0c;谨慎解释和应用相关…

基于知识图谱的医药问答系统实战

数据及代码地址见文末 1.项目配置 (1)Neo4j数据库安装 JDK 安装:https://www.oracle.com/java/technologies/javase-downloads.html Neo4j 安装:https://neo4j.com/download-center/ 配置好 JDK 和 Neo4j 的环境变量 启动:neo4j.bat console 第一次启动有默认用户名和密…

数字信号处理教程(1)——简介

考了几天试&#xff0c;终于有时间来继续写了&#xff0c;接下来&#xff0c;我们主要对数字信号处理和通信原理这两本偏于理论书记录自己的简单看法。当然其他大家讲的比较好的地方&#xff0c;我也会摘录下来。 先来看数字信号处理的内容&#xff0c;数字信号处理中有…

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 绑定多个触发器到同一函数…

【ai】trition:tritonclient yolov4:ubuntu18.04部署python client成功

X:\05_trition_yolov4_clients\01-python server代码在115上,client本想在windows上, 【ai】trition:tritonclient.utils.shared_memory 仅支持linux 看起来要分离。 【ai】tx2 nx:ubuntu18.04 yolov4-triton-tensorrt 成功部署server 运行 client代码远程部署在ubuntu18.0…

从灵感到实践:Kimi辅助完成学术论文选题的文艺之旅

学境思源&#xff0c;一键生成论文初稿&#xff1a; AcademicIdeas - 学境思源AI论文写作 昨天我们为大家介绍了ChatGPT辅助完成实现设计&#xff08;AI与学术的交响&#xff1a;ChatGPT辅助下的实验设计新篇章&#xff09;。今天我们再来看看Kimi对于论文选题都能提供哪些帮助…

mindspore打卡第9天 transformer的encoder和decoder部分

mindspore打卡第9天 transformer的encoder和decoder部分 import mindspore from mindspore import nn from mindspore import ops from mindspore import Tensor from mindspore import dtype as mstypeclass ScaledDotProductAttention(nn.Cell):def __init__(self, dropout_…

如何修改PDF文档的作者名称?

要修改一个 PDF 文档的作者名称&#xff0c;你可以按照以下步骤进行操作&#xff1a; 1. **使用 Adobe Acrobat**&#xff08;如果有&#xff09;&#xff1a; - Adobe Acrobat 是一个功能强大的 PDF 编辑工具&#xff0c;支持修改文档属性信息&#xff0c;包括作者名称。打开…

SSRF一篇文章实战举例全面学懂

前言 Gopher协议在SSRF漏洞中的深入研究&#xff08;附视频讲解&#xff09; - 知乎 (zhihu.com) 上面这篇文章真的写的很好&#xff0c;是目前看过最好的将SSRF(服务端请求伪造)和Gopher协议的内容。 然后这种题型&#xff0c;我记得在之前的文章&#xff0c;金砖里有个云启…

Python 面试【★★★】

欢迎莅临我的博客 &#x1f49d;&#x1f49d;&#x1f49d;&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:「stormsha的主页」…

HIVE每日一题

select * from sku_info order by sku_id ; 为什么结果没有顺序排序。什么原因导致的&#xff1f;

第二十一课,列表的操作函数

一&#xff0c;len(列表):求列表的长度 当你需要知道一个列表中含有多少个元素时&#xff0c;可以使用len()函数&#xff0c;将列表的变量名放入len()函数的括号中&#xff0c;它将告诉你这个列表中有多少个元素&#xff0c;也就是它的长度&#xff01; 需要注意的是&#xf…

电脑文件夹里的表格删除了怎样恢复?别急,可这样做

在日常工作中&#xff0c;我们经常会使用到各种电子表格来记录、整理和分析数据。然而&#xff0c;有时由于操作失误或其他原因&#xff0c;我们可能会不小心将电脑文件夹中的重要表格删除。面对这种情况&#xff0c;许多人可能会感到惊慌失措&#xff0c;担心数据丢失会给工作…

试析C#编程语言的特点及功能

行步骤&#xff0c;而不必创建新方法。其声明方法是在实例化委托基础上&#xff0c;加一对花括号以代表执行范围&#xff0c;再加一个分号终止语句。 2.3.3 工作原理 C#编译器在“匿名”委托时会自动把执行代码转换成惟一命名类里的惟一命名函数。再对存储代码块的委托进行设…

吉时利 Keithley2470 图形数字源表

Keithley2470吉时利图形SMU数字源表 2470 型图形化高压 SourceMeter SMU 2470 高压 SMU 凭借其 1100V 和 10fA 能力&#xff0c;经优化用于检定和测试高电压、低泄漏器件、材料和模块&#xff0c;如碳化硅 (SiC)、氮化镓(GaN)、功率 MOSFET、瞬态抑制器件、电路保护器件、功率…

5个大气的wordpress付费主题

Sesko赛斯科wordpress外贸主题 适合用于重型机械设备公司建外贸官方网站的橙红色wordpress外贸主题。 https://www.jianzhanpress.com/?p5886 Polar钋啦wordpress外贸主题 制造业wordpress网站模板&#xff0c;适合生产制造企业官方网站使用的wordpress外贸主题。 https:/…

【新能源汽车-电控】控制芯片、电机控制、电机结构、硬件相关、通讯协议、操作系统、上位机、C语言汇总

【新能源汽车-电控】控制芯片、电机控制、电机结构、硬件相关、通讯协议、操作系统、上位机、C语言汇总 文章目录 前言一、控制芯片二、电机控制三、电机结构三、硬件相关四、通讯协议五、操作系统六、上位机七、C语言总结 前言 提示&#xff1a;以下是本篇文章正文内容&#…