每日一题——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 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.mfbz.cn/a/756306.html

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

相关文章

秋招突击——第九弹——Redis缓存

文章目录 引言正文缓存基础旁路缓存模式&#xff08;重点&#xff09;读穿透&#xff08;了解&#xff09;写穿透&#xff08;了解&#xff09;异步缓存写入模式面试重点 缓存异常场景缓存穿透缓存击穿缓存雪崩面试重点 缓存一致性怎么保证&#xff1f;缓存一致性问题是什么方案…

使用SpringBoot整合filter

SpringBoot整合filter&#xff0c;和整合servlet类似&#xff0c;也有两种玩儿法 1、创建一个SpringBoot工程&#xff0c;在工程中创建一个filter过滤器&#xff0c;然后用注解WebFilter配置拦截的映射 2、启动类还是使用ServletComponentScan注解来扫描拦截器注解WebFilter 另…

Vue2中管理$bus事件,统一移除事件

1. vue2中使用了,很多bus,在有些地方忘记清理了,导致重复事件bug. 对bus进行改造,实现清除遗留. 下面的简单实现. 1.eventbus.js // eventBus.js import Vue from vue;class EventBusClass extends Vue {constructor() {super();this.listeners [];}on(event, callback, con…

实测备受好评的三款独享IP网站服务商

一、引言 在如今互联网快速发展的时代&#xff0c;网络爬虫、数据抓取等任务对于许多企业和个人来说愈发重要&#xff0c;而在这个过程中&#xff0c;一个稳定、高效且安全的独享IP资源显得尤为重要。作为专业的测评团队&#xff0c;我们深知一款优秀的独享IP服务商需要具备哪…

2-19 基于matlab的薄板弯曲的算例

基于matlab的薄板弯曲的算例&#xff0c;利用有限元方法编制matlab程序。对二维薄板进行单元化&#xff0c;输出薄板结构参数及载荷&#xff0c;输出弯曲情况&#xff0c;并可视化展示。程序已调通&#xff0c;可直接运行。 2-19 薄板弯曲 有限元方法 薄板结构参数 - 小红书 (x…

【MySQL】InnoDB架构

本文MySQL版本是8.X版本 这是官方文档给出来的架构图&#xff1a;MySQL :: MySQL 8.0 Reference Manual :: 17.4 InnoDB Architecture 可以看出&#xff0c;整体上是分成两部分的&#xff1a;内存结构(提高效率)和磁盘结构(数据持久化)&#xff0c;下面将把每个区域都大致做一个…

Java程序员学习Go开发Higress的WASM插件

Java程序员学习Go开发Higress的WASM插件 契机 ⚙ 今年天池大赛有higress相关挑战&#xff0c;研究一下。之前没搞过go&#xff0c;踩了很多坑&#xff0c;最主要的就是tinygo打包&#xff0c;多方寻求解决无果&#xff0c;结论是tinygo0.32go1.19无法在macos arm架构下打包。…

【微服务】Alibaba Cloud Linux环境下Docker以及MySQL安装

部署Docker 1.安装dnf dnf是新一代的rpm软件包管理器 yum -y install dnf2.安装社区版Docker&#xff08;docker-ce&#xff09; 添加docker-ce的dnf源 dnf config-manager --add-repohttps://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo安装Alibaba Cloud…

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

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

kali/ubuntu安装vulhub

无须更换源&#xff0c;安装docker-compose apt install docker.io docker -vdocker-compose #提示没有&#xff0c;输入y安装mkdir -p /etc/docker vi /etc/docker/daemon.json #更换dockerhub国内源┌──(root㉿kali)-[/home/kali/vulhub-master/tomcat/CVE-2017-12615] …

轻量级模型,重量级性能,TinyLlama、LiteLlama小模型火起来了

小身板&#xff0c;大能量。 当大家都在研究大模型&#xff08;LLM&#xff09;参数规模达到百亿甚至千亿级别的同时&#xff0c;小巧且兼具高性能的小模型开始受到研究者的关注。 小模型在边缘设备上有着广泛的应用&#xff0c;如智能手机、物联网设备和嵌入式系统&#xff0…

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

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

Pythonnet能导入clr,但无法引入System模块?

【pythonnet详解】—— Python 和 .NET 互操作的库_pythonnet 详细使用-CSDN博客 Python中动态调用C#的dll动态链接库中方法_python 如何调用c# dll-CSDN博客 需求&#xff1a;Python调用并传List<float>类型参数给.Net 起初&#xff1a;直接 # 创建一个Python浮点数…

ElasticSearch 和 MySQL的区别

MySQLElasticSearch 数据库&#xff08;database&#xff09;索引&#xff08;index&#xff09;数据表&#xff08;table&#xff09; 类型&#xff08;type&#xff09; 记录文档&#xff08;document&#xff0c;json格式&#xff09; 一、ES基础命令 1. ES cat查询命令 2.…

keil软件的一些使用技巧

1.MDK 的 TAB 键支持块操作 也就是可以让一片代码整体右移固定的几个位&#xff0c;也可以通过 SHIFTTAB 键整体左移固定的几个位。 2.快速注释与快速消注释 就是先选中你要注释的代码区&#xff0c;然后右键&#xff0c;选择Advanced→Comment Selection 就可以了。 3.快速打…

vue-cli搭建过程

1.vue-cli 概述 vue-cli 官方提供的一个脚手架&#xff0c;用于快速生成一个 vue 的项目模板&#xff0c;预先定义好的目录结构及基础代码 举个例子吧&#xff01; 比如之前学过的Maven,在创建 Maven 项目时可以选择创建一个骨架项目&#xff0c;这个骨架项目就是脚手架&#x…

web安全渗透测试十大常规项(一):web渗透测试之Fastjson反序列化

渗透测试之Java反序列化 1. Fastjson反序列化1.1 FastJson反序列化链知识点1.2 FastJson反序列化链分析1.3.1 FastJson 1.2.24 利用链分析1.3.2 FastJson 1.2.25-1.2.47 CC链分析1.3.2.1、开启autoTypeSupport:1.2.25-1.2.411.3.2.2 fastjson-1.2.42 版本绕过1.3.2.3 fastjson…

详解ApplicationRunner和CommandLineRunner

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

15秒下雨短视频:成都柏煜文化传媒有限公司

15秒下雨短视频&#xff1a;瞬间的诗意与情感共鸣 在数字时代的浪潮中&#xff0c;短视频以其独特的魅力&#xff0c;成为了人们生活中不可或缺的一部分。其中&#xff0c;一段仅15秒的下雨短视频&#xff0c;成都柏煜文化传媒有限公司 或许在时间长河中只是一瞬间&#xff0c…

用通俗易懂方式讲解:快速部署大模型 ChatGLM3 并进行推理

在深入了解了一些大模型的知识之后&#xff0c;最好的方法是亲自动手搭建一个开源的大模型&#xff0c;以更深入地理解其工作原理。 在此基础上&#xff0c;我们将以 ChatGLM3 为例进行部署及推理&#xff0c;从而进一步探索大模型的应用和实践。 ChatGLM3简介&#xff1a; …