每日一题——Python实现PAT甲级1116 Come on! Let‘s C(举一反三+思想解读+逐步优化)五千字好文


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

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

Python-3.12.0文档解读

目录

 我的写法

代码点评

时间复杂度分析

空间复杂度分析

总结

我要更强

优化思路

优化后的代码

时间复杂度分析

空间复杂度分析

优化总结

哲学和编程思想

1. 时间复杂度与空间复杂度的权衡

哲学思想:资源优化(Resource Optimization)

2. 使用合适的数据结构

哲学思想:选择合适工具(Right Tool for the Job)

3. 减少不必要的操作

哲学思想:简洁性(Simplicity)

4. 一次性读取和输出数据

哲学思想:批处理(Batch Processing)

5. 高效的算法

哲学思想:算法优化(Algorithm Optimization)

6. 幂等性和状态管理

哲学思想:幂等性(Idempotency)与状态管理(State Management)

总结

举一反三

1. 优化时间和空间复杂度

技巧:

思想:

2. 使用合适的数据结构

技巧:

思想:

3. 减少不必要的操作

技巧:

思想:

4. 批处理和减少I/O操作

技巧:

思想:

5. 高效算法选择

技巧:

思想:

6. 幂等性和状态管理

技巧:

思想:

举一反三的应用

总结


题目链接

 我的写法

import sys
import mathdef is_prime(num):if num <= 1:return Falseif num <= 3:return Trueif num % 2 == 0 or num % 3 == 0:return Falsefor i in range(5, int(math.sqrt(num)) + 1, 6):if num % i == 0 or num % (i + 2) == 0:return Falsereturn Trueinput = sys.stdin.read
data = input().split()
N = int(data[0])
ranklist_ids = {}
for i in range(1, N + 1):ranklist_ids[data[i]] = ichecked_ids = set()
K = int(data[N + 1])output = []for i in range(N + 2, K + N + 2):query_id = data[i]if query_id in ranklist_ids:if query_id in checked_ids:output.append(f"{query_id}: Checked")else:rank = ranklist_ids[query_id]if rank == 1:output.append(f"{query_id}: Mystery Award")elif is_prime(rank):output.append(f"{query_id}: Minion")else:output.append(f"{query_id}: Chocolate")checked_ids.add(query_id)else:output.append(f"{query_id}: Are you kidding?")# 将所有输出一次性打印,减少 I/O 操作
sys.stdout.write("\n".join(output) + "\n")

代码点评

这段代码实现了对一组ID的排名查询,并根据排名给出不同的反馈。代码结构清晰,使用了适当的数据结构(字典和集合)来优化查询效率。下面是对代码的详细点评:

  1. 模块导入:
    • 使用了sys和math模块,分别用于处理输入输出和数学运算,这是合理的。
  2. 函数定义:
    • is_prime函数用于判断一个数是否为素数,使用了优化的算法,只检查到平方根,减少了不必要的计算。
  3. 数据处理:
    • 使用sys.stdin.read一次性读取所有输入,减少了I/O操作的次数。
    • 将输入数据分割后存储在列表data中,方便后续处理。
  4. 数据结构使用:
    • 使用字典ranklist_ids存储ID和其对应的排名,利用字典的快速查找特性,提高了查询效率。
    • 使用集合checked_ids存储已检查的ID,避免了重复检查,优化了处理流程。
  5. 输出处理:
  • 将所有输出存储在列表output中,最后一次性输出,减少了I/O操作的次数,提高了效率。

时间复杂度分析

  • 读取输入:O(N + K),其中N是排名列表中的ID数量,K是查询的ID数量。
  • 构建排名字典:O(N),遍历排名列表一次。
  • 查询处理:O(K),每个查询操作的时间复杂度是O(1),因为使用了字典和集合。
  • 输出:O(N + K),构建输出列表的时间。

总时间复杂度为O(N + K)。

空间复杂度分析

  • 存储输入数据:O(N + K),需要存储所有输入数据。
  • 排名字典:O(N),存储所有排名信息。
  • 已检查ID集合:O(K),最多存储K个已检查的ID。
  • 输出列表:O(K),存储所有查询结果。

总空间复杂度为O(N + K)。

总结

这段代码在处理大量数据时表现良好,时间复杂度和空间复杂度都与输入规模成线性关系,效率较高。代码结构清晰,使用了合适的数据结构和算法,是一段高质量的代码。


我要更强

这段代码已经相对高效,不过还是可以在一些细节上进行优化,以进一步提升性能。以下是一些可能的优化方法:

  1. 减少不必要的操作:在查询阶段直接读取和处理数据,而不是预先存储所有ID。
  2. 优化素数判断函数:虽然当前实现已经较优化,但我们可以进一步减少检查次数。

以下是经过优化的完整代码和分析:

优化思路

  • 减少内存占用:只在需要时存储数据,而不是预先存储所有ID和排名。
  • 优化素数判断:利用更高效的素数判断算法。

优化后的代码

python复制

import sys
import mathdef is_prime(num):"""判断一个数是否为素数"""if num <= 1:return Falseif num <= 3:return Trueif num % 2 == 0 or num % 3 == 0:return Falsefor i in range(5, int(math.sqrt(num)) + 1, 6):if num % i == 0 or num % (i + 2) == 0:return Falsereturn True# 从标准输入读取所有数据
input = sys.stdin.read
data = input().split()N = int(data[0])  # 排名列表中的ID数量
ranklist_ids = {data[i]: i for i in range(1, N + 1)}  # 构建ID和排名的字典
checked_ids = set()  # 存储已检查的ID
K = int(data[N + 1])  # 查询的ID数量output = []  # 用于存储最终输出的结果列表# 处理所有查询
for i in range(N + 2, N + 2 + K):query_id = data[i]if query_id in ranklist_ids:if query_id in checked_ids:output.append(f"{query_id}: Checked")else:rank = ranklist_ids[query_id]if rank == 1:output.append(f"{query_id}: Mystery Award")elif is_prime(rank):output.append(f"{query_id}: Minion")else:output.append(f"{query_id}: Chocolate")checked_ids.add(query_id)else:output.append(f"{query_id}: Are you kidding?")# 将所有输出结果一次性打印,减少I/O操作
sys.stdout.write("\n".join(output) + "\n")

时间复杂度分析

  • 读取输入:O(N + K),其中N是排名列表中的ID数量,K是查询的ID数量。
  • 构建排名字典:O(N),遍历排名列表一次。
  • 查询处理:O(K),每个查询操作的时间复杂度是O(1),因为使用了字典和集合。
  • 输出:O(K),构建输出列表的时间。

总时间复杂度为O(N + K)。

空间复杂度分析

  • 存储输入数据:O(N + K),需要存储所有输入数据。
  • 排名字典:O(N),存储所有排名信息。
  • 已检查ID集合:O(K),最多存储K个已检查的ID。
  • 输出列表:O(K),存储所有查询结果。

总空间复杂度为O(N + K)。

优化总结

通过以上优化,确保在时间和空间上的复杂度都保持在O(N + K)的水平,而代码的可读性和效率也得到了提升。这段优化后的代码更紧凑,并且在处理查询时更加直接。


哲学和编程思想

在优化这段代码的过程中,运用了多种编程思想和哲学,以提升代码的效率和可读性。以下是具体的分析:

1. 时间复杂度与空间复杂度的权衡

哲学思想:资源优化(Resource Optimization)
  • 描述:在计算机科学中,时间和空间是两种重要的资源。通常情况下,优化一方面可能会牺牲另一方面,需要在两者之间找到一个平衡点。
  • 应用:我们在优化过程中,确保时间复杂度和空间复杂度都保持在O(N + K)的水平,既保证处理速度,又不浪费内存资源。

2. 使用合适的数据结构

哲学思想:选择合适工具(Right Tool for the Job)
  • 描述:不同的数据结构有不同的特点和适用场景,选择合适的数据结构能够显著提升程序的效率。
  • 应用:使用了字典(dict)来存储ID与排名的映射,以实现快速查找操作(O(1)时间复杂度);使用集合(set)来存储已检查的ID,以实现快速存在性检查(O(1)时间复杂度)。

3. 减少不必要的操作

哲学思想:简洁性(Simplicity)
  • 描述:减少不必要的步骤和操作,使代码更加简洁高效。
  • 应用:在查询阶段直接处理数据,而不是预先存储所有ID,这样减少了内存占用,并避免了多次遍历数据。

4. 一次性读取和输出数据

哲学思想:批处理(Batch Processing)
  • 描述:通过一次性读取和处理大量数据,减少频繁I/O操作,提升程序运行效率。
  • 应用:使用sys.stdin.read一次性读取所有输入数据,使用sys.stdout.write一次性输出所有结果,减少了多次I/O操作的开销。

5. 高效的算法

哲学思想:算法优化(Algorithm Optimization)
  • 描述:选择高效的算法来解决问题,减少计算量和时间开销。
  • 应用:在素数判断中,使用优化的算法,仅检查到平方根且跳过明显非素数的数(如偶数和3的倍数),减少了不必要的计算。

6. 幂等性和状态管理

哲学思想:幂等性(Idempotency)与状态管理(State Management)
  • 描述:在重复操作中确保操作结果不变,这样可以避免重复计算和不一致的结果。
  • 应用:通过集合checked_ids记录已检查的ID,保证每个ID只处理一次,避免重复处理,确保程序状态一致性。

总结

通过运用以上哲学和编程思想,在优化过程中,既提升了代码的效率,又保持了代码的简洁和可维护性。这些思想不仅可以应用在这段代码中,对于其他编程任务同样适用,是编写高质量代码的重要原则。


举一反三

理解并应用编程哲学和思想能够大幅提升你的代码质量和效率。以下是一些常见的编程技巧和实践,每个技巧背后都有相关的哲学思想,希望能在不同的编程场景中灵活应用。

1. 优化时间和空间复杂度

技巧:
  • 时间复杂度:在选择算法时,优先考虑时间复杂度较低的算法。例如,尽量避免使用O(n^2)的算法(如嵌套循环),可以考虑使用分治法、动态规划等优化算法。
  • 空间复杂度:尽量减少不必要的数据存储,使用合适的数据结构(如数组、链表、哈希表)来优化内存使用。
思想:
  • 资源优化:在开发过程中,始终考虑如何在时间和空间之间找到平衡点。

2. 使用合适的数据结构

技巧:
  • 哈希表:用于快速查找、插入和删除操作。
  • 数组/列表:用于需要快速访问元素的场景。
  • 队列/栈:用于需要先进先出(FIFO)或后进先出(LIFO)操作的场景。
  • 树/图:用于表示层次结构或连接关系的场景。
思想:
  • 选择合适工具:根据具体问题选择最合适的数据结构,以提升程序的性能和可读性。

3. 减少不必要的操作

技巧:
  • 懒加载:仅在需要时才初始化或计算数据,避免提前占用资源。
  • 缓存:对于重复计算的结果进行缓存,避免多次计算相同的结果。
  • 优雅的条件检查:尽量简化条件检查,避免多余的判断。
思想:
  • 简洁性:代码应尽量简洁,减少不必要的复杂性。

4. 批处理和减少I/O操作

技巧:
  • 批量读取和写入:尽量一次性读取或写入大量数据,减少I/O操作的次数。
  • 缓冲区使用:使用缓冲区来提高I/O操作的效率。
思想:
  • 批处理:通过一次性处理大量数据,提高程序的整体效率。

5. 高效算法选择

技巧:
  • 分治法:将问题分解为规模较小的子问题再逐步解决,如快速排序、归并排序。
  • 动态规划:通过记录中间结果,避免重复计算,如斐波那契数列、背包问题。
  • 贪心算法:在每一步选择中做出局部最优选择,期望最终结果是全局最优,如最小生成树、活动选择问题。
思想:
  • 算法优化:选择适合的高效算法解决问题,减少计算开销。

6. 幂等性和状态管理

技巧:
  • 幂等操作:设计函数和方法时,确保对同一输入多次调用结果不变,常用于接口设计和数据库操作。
  • 状态管理:使用状态管理工具(如Redux、Vuex)集中管理应用状态,避免不同部分状态不一致。
思想:
  • 幂等性状态管理:确保程序在重复操作中保持一致性,避免不必要的副作用。

举一反三的应用

  1. 优化查询操作

    • 思想:选择合适的数据结构(如哈希表)进行快速查找。
    • 应用:在需要反复查找的场景中,优先使用哈希表来存储和查找数据。
  2. 减少重复计算

    • 思想:使用缓存(如Memoization)记录中间结果。
    • 应用:在递归算法中,通过缓存已计算的结果,避免重复计算,提高效率。
  3. 简化代码逻辑

    • 思想:简化条件判断,减少嵌套层次。
    • 应用:在复杂的条件判断中,尽量将相似的条件合并,或重构为多个简单函数,提高代码可读性。
  4. 批量操作

    • 思想:尽量一次性处理大量数据,减少I/O操作。
    • 应用:在处理大文件或大量网络请求时,采用批量读取或写入的方式,减少I/O次数,提高效率。

总结

通过理解并应用这些编程技巧和思想,可以在不同的编程场景中灵活运用,提升代码的效率和可读性。每种技巧背后的思想都是编程中的基本原则,掌握这些原则将帮助在面对复杂问题时,能够更自如地找到最优解。

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

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

相关文章

全球首个光量子计算机生产线落地!量子计算机要量产了

内容来源&#xff1a;量子前哨&#xff08;ID&#xff1a;Qforepost&#xff09; 文丨娴睿/慕一 排版丨沛贤 深度好文&#xff1a;1000字丨5分钟阅 摘要&#xff1a;欧洲量子计算服务提供商Quandela以其创新的光量子比特生产技术&#xff0c;致力于推动量子计算的工业规模化…

三角剖分技术在AI绘画中的艺术与创新

引言&#xff1a; 随着人工智能技术的不断进步&#xff0c;AI绘画作为一种新兴的艺术创作方式逐渐进入人们的视野。它不仅改变了传统艺术创作的模式&#xff0c;还为艺术家和设计师提供了全新的工具。在AI绘画中&#xff0c;三角剖分技术扮演着至关重要的角色&#xff0c;它不仅…

ABeam News | ABeam德硕受邀参访建王设计,细化双方ESG合作可能点

0523 ABeam News 左起&#xff1a;ABeam大中华区董事长兼总经理中野洋辅、建王设计北京办公室总监田禾、建王设计北京办公室总经理王丽、ABeam中国ESG与可持续发展负责人杨丽楠、ABeam上海办公室王培培 建王 随着ESG&#xff08;环境、社会和治理&#xff09;理念近年来的持续…

Springboot的小型超市商品展销系统-计算机毕业设计源码01635

摘 要 科技进步的飞速发展引起人们日常生活的巨大变化&#xff0c;电子信息技术的飞速发展使得电子信息技术的各个领域的应用水平得到普及和应用。信息时代的到来已成为不可阻挡的时尚潮流&#xff0c;人类发展的历史正进入一个新时代。在现实运用中&#xff0c;应用软件的工作…

Lua解释器裁剪

本文目录 1、引言2、文件功能3、选择需要初始化的库4、结论 文章对应视频教程&#xff1a; 已更新。见下方 点击图片或链接访问我的B站主页~~~ Lua解释器裁剪&#xff0c;很简单~ 1、引言 在嵌入式中使用lua解释器&#xff0c;很多时候会面临资源紧张的情况。 同时&#xff0c…

以 ZGC 为例,谈一谈 JVM 是如何实现 Reference 语义的

本文基于 OpenJDK17 进行讨论 1. Reference 相关概念及其应用场景总览 Reference&#xff08;引用&#xff09;是 JVM 中非常核心且重要的一个概念&#xff0c;垃圾回收器判断一个对象存活与否都是围绕着这个 Reference 来的&#xff0c;JVM 将 Reference 又细分为几种具体的引…

记录汇川:计算机-ST

某小学校内&#xff0c;数学教学组&#xff0c;为了能给新进学生更好的体验到电子计算器高速的计算能力&#xff0c;打算打造一个计算实操台&#xff0c;能够兼容任意数字的加、减、乘、除的功能全自动计算器实操台项目由可编程逻辑控制器与人机界面组成。 1、拥有加、减、乘、…

Tkinter的完美伴侣:加强版GUI库揭秘(界面升级不止步:如何用一个库强化Tkinter)

文章目录 📖 介绍 📖🏡 演示环境 🏡📒 文章内容 📒🚀 安装🔖 创建第一个应用💡 主要特性🔓 主题切换📢 示例项目⚓️ 相关链接 ⚓️📖 介绍 📖 Tkinter作为Python标准库中最常用的GUI工具包,其简单易用的特性深受开发者喜爱。然而,Tkinter在界面美…

共话大模型技术进展与挑战,CCF大模型论坛北京会议圆满落幕!

2024 年 6 月 6 日中国计算机学会大模型论坛&#xff08;CCF FoLM&#xff09;主题会议在北京顺利举办。本次会议主题为“大模型技术进展与挑战”&#xff0c;各位专家围绕大模型技术的前沿动态、发展趋势及技术挑战等议题展开深入探讨&#xff0c;为广大从业者、研究者提供了一…

C#开源项目推荐:Watt Toolkit跨平台游戏工具箱支持github网络加速

Watt Toolkit是一个开源跨平台的多功能游戏工具箱&#xff0c;主要专注于增强玩家在Steam平台上的游戏体验及国外网站平台加速。 主要功能 兼容性 用户数据 团队背景 github加速功能 使用方法&#xff1a;用户只需在Watt Toolkit中启用网络加速功能&#xff0c;并选择对Gi…

LogicFlow 学习笔记——3. LogicFlow 基础 节点 Node

节点 Node LogicFlow 内置了一些基础节点&#xff0c;开发者在实际应用场景中&#xff0c;可以基于这些基础节点&#xff0c;定义符合自己业务逻辑的节点。 认识基础节点 LogicFlow是基于svg做的流程图编辑框架&#xff0c;所以我们的节点和连线都是svg基本形状&#xff0c;…

【DPDK学习路径】二、DPDK简介

DPDK(Data Plane Development Kit)是一个框架&#xff0c;用于快速报文处理。 在linux内核提供的报文处理模型中&#xff0c;接收报文的处理路径为&#xff1a;首先由网卡硬件接收&#xff0c;产生硬中断&#xff0c;触发网卡驱动程序注册的中断函数处理&#xff0c;之后产生软…

后继者00

题目链接 后继者 题目描述 注意点 题目中的树是二叉搜索树节点p在二叉搜索树中一定存在 解答思路 本题关键是找到值大于节点p的值的第一个节点&#xff0c;因为本题中的树是二叉搜索树&#xff0c;所以左子树的值始终小于根节点&#xff0c;右子树的值始终大于根节点访问到…

鸿蒙开发:通过startAbilityByType拉起垂类应用

通过startAbilityByType拉起垂类应用 使用场景 开发者可通过特定的业务类型如导航、金融等&#xff0c;调用startAbilityByType接口拉起对应的垂域面板&#xff0c;该面板将展示目标方接入的垂域应用&#xff0c;由用户选择打开指定应用以实现相应的垂类意图。垂域面板为调用…

【数据结构】双向链表(C语言)

哈喽铁子们&#xff0c;这里是博主鳄鱼皮坡。这篇文章将分享交流双向链表的相关知识&#xff0c;下面正式开始。 1. 双向链表的结构 注意&#xff1a;这里的“带头”跟前面我们说的“头节点”是两个概念&#xff0c;实际前面的在单链表阶段称呼不严 谨&#xff0c;但是为了老…

Shopee争议本土卖家如何拒绝退款? EasyBoss ERP扫描发货功能来帮忙

Shopee本土店卖家在运营过程中难免会遇到一些售后订单的问题&#xff0c;比如&#xff1a; 明明发货了买家却说没收到&#xff01; 没发错货&#xff0c;买家却说货不对&#xff01; 明明发出时商品完好的&#xff0c;但是买家却说是坏的&#xff01; 根据Shopee的退货政策…

15:HAL----ADC模数转化器

STM32C8T6有2个ADC,ADC1和ADC2 一&#xff1a;介绍 1:简历 ADC&#xff08;Analog-Digital Converter&#xff09;模拟-数字转换器 ADC可以将引脚上连续变化的模拟电压转换为内存中存储的数字变量&#xff0c;建立模拟电路到数字电路的桥梁 12位逐次逼近型ADC&#xff0c;1us转…

Java从放弃到继续放弃

并发编程 为什么需要多线程&#xff1f; 由于硬件的发展&#xff0c;CPU的核数增多&#xff0c;如果仍然使用单线程对CPU资源会造成浪费。同时&#xff0c;单线程也会出现阻塞的问题。所以&#xff0c;选择向多线程转变。 多线程的使用使得程序能够并行计算&#xff0c;提高计…

python学习—合并多个Excel工作簿表格文件

系列文章目录 python学习—合并TXT文本文件 python学习—统计嵌套文件夹内的文件数量并建立索引表格 python学习—查找指定目录下的指定类型文件 python学习—年会不能停&#xff0c;游戏抽签抽奖 python学习—循环语句-控制流 文章目录 系列文章目录功能说明1 准备工作&#…

服务器数据恢复—EMC Isilon存储中被误删的虚拟机数据恢复案例

服务器存储数据恢复环境&#xff1a; EMC Isilon S200集群存储&#xff0c;共三个节点&#xff0c;每节点配置12块SATA硬盘。 服务器存储故障&#xff1a; 工作人员误操作删除虚拟机&#xff0c;虚拟机中数据包括数据库、MP4、AS、TS类型的视频文件等。需要恢复数据的虚拟机通…