每日一题——Python实现蓝桥杯1. 坤坤的破译任务(举一反三+思想解读+逐步优化)三千字好文


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

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

Python-3.12.0文档解读

目录

 我的写法

时间复杂度:

空间复杂度:

我要更强

时间复杂度分析:

空间复杂度分析:

哲学和编程思想

举一反三


题目链接:https://www.lanqiao.cn/problems/17056/learning/?page=1&first_category_id=1

 我的写法

import os
import sysN=int(input())
nums=set(map(int,input().split()))print(*sorted([i for i in range(N+1) if i not in nums]))

这段代码的主要功能是读取用户输入的一组整数,然后找出并打印出从1到N的所有缺失的整数。下面是对这段代码的分析:

  1. 输入处理:
    • N=int(input()):读取用户输入的第一个整数,表示序列的长度。
    • nums=set(map(int,input().split())):读取用户输入的第二行,将其分割成整数列表,并通过set转换为集合。这样做的好处是集合的成员检查操作(in)的时间复杂度为O(1),相比于列表的O(n)要快很多。
  2. 缺失数字的查找:
    • [i for i in range(N+1) if i not in nums]:这是一个列表推导式,用于生成从0到N(包括N)的所有整数中不在nums集合中的整数。这里使用了if i not in nums来检查每个整数是否在集合中,由于集合的查找操作是常数时间,这一步的时间复杂度是O(N)。
  3. 输出:
  • print(*sorted([i for i in range(N+1) if i not in nums])):首先对列表推导式生成的列表进行排序,然后使用*操作符解包列表并打印出所有元素。排序的时间复杂度是O(N log N),但由于这里N的最大值是输入的N+1,所以整体的时间复杂度可以认为是O(N log N)。

时间复杂度:

  • 输入处理:O(N)
  • 缺失数字查找:O(N)
  • 排序:O(N log N)
  • 总时间复杂度:O(N + N log N),通常可以简化为O(N log N)。

空间复杂度:

  • 存储输入的整数集合:O(N)
  • 存储缺失的整数列表:O(N)
  • 总空间复杂度:O(N)

这段代码在处理大数据时效率较高,尤其是利用了集合来优化查找操作。不过,如果N非常大,排序操作可能会成为性能瓶颈。在实际应用中,可以根据具体情况考虑是否需要优化排序步骤。


我要更强

为了优化时间复杂度和空间复杂度,我们可以避免排序操作,并尽可能减少不必要的集合操作。以下是一种优化方法,使用位图(bitmap)来表示数字的存在状态,这样可以以O(1)的时间复杂度检查数字是否存在,并且空间复杂度为O(N)。

import os
import sys# 读取输入
N = int(input())
nums = list(map(int, input().split()))# 初始化位图,所有位都设置为0
bitmap = [0] * (N + 1)# 将输入的数字在位图中对应的位设置为1
for num in nums:if num <= N:  # 确保数字不超过Nbitmap[num] = 1# 遍历位图,打印出所有值为0的索引,即缺失的数字
for i in range(1, N + 1):if bitmap[i] == 0:print(i, end=' ')# 注意:这种方法假设输入的数字都是正整数且不超过N

时间复杂度分析:

  • 输入处理:O(N)
  • 设置位图:O(N)
  • 打印缺失数字:O(N)
  • 总时间复杂度:O(N)

空间复杂度分析:

  • 位图:O(N)
  • 总空间复杂度:O(N)

这种方法在时间和空间上都比原方法更高效,因为它避免了排序操作,并且使用位图来表示数字的存在状态,从而减少了空间的使用。这种方法的一个前提是输入的数字都是正整数且不超过N,如果输入可能包含负数或超过N的数字,这种方法需要进一步的修改。


哲学和编程思想

上述优化方法体现了以下哲学和编程思想:

  1. 抽象化(Abstraction): 使用位图(bitmap)是一种抽象化的表现,它将数字的存在状态抽象为位的集合。这种抽象化简化了问题的表示和处理,使得我们可以用更少的内存和更快的速度来处理问题。
  2. 空间与时间的权衡(Space-Time Tradeoff): 原方法中使用了集合来存储数字,这虽然加快了查找速度(O(1)),但增加了空间的使用。优化方法中使用位图,虽然空间复杂度仍然是O(N),但位图的空间效率更高,因为它只使用一个位来表示一个数字的存在状态,而不是整个整数。这种权衡是编程中常见的,通常需要在空间和时间效率之间做出选择。
  3. 算法优化(Algorithm Optimization): 优化方法避免了排序操作,这是算法优化的一个例子。通过选择合适的算法和数据结构,我们可以显著提高程序的效率。在这个例子中,使用位图代替排序,使得时间复杂度从O(N log N)降低到O(N)。
  4. 数据结构的选择(Data Structure Selection): 选择合适的数据结构是解决问题的关键。原方法中使用了集合,而优化方法中使用了位图。这两种数据结构都适合处理这个问题,但位图在空间效率上更优。这体现了在编程中选择合适数据结构的重要性。
  5. 假设与约束(Assumptions and Constraints): 优化方法假设输入的数字都是正整数且不超过N。这种假设简化了问题,但同时也限制了方法的适用范围。在实际编程中,我们需要明确问题的假设和约束,以确保解决方案的正确性和有效性。
  6. 迭代与增量开发(Iterative and Incremental Development): 在编程实践中,我们通常不会一次性找到最佳解决方案。原方法是一个起点,通过分析其性能,我们可以逐步优化,最终得到更高效的解决方案。这种迭代和增量开发的方法是软件工程中的一个重要思想。

通过这些哲学和编程思想的应用,可以更有效地解决问题,提高代码的质量和性能。


举一反三

基于上述哲学和编程思想,以下是一些技巧和策略,可以帮助在面对类似问题时举一反三:

  1. 理解问题的本质: 在开始解决问题之前,深入理解问题的本质和需求。例如,在这个问题中,我们需要找出缺失的数字,这意味着我们需要一个能够快速检查数字是否存在的方法。
  2. 选择合适的数据结构: 根据问题的需求选择最合适的数据结构。例如,位图在表示和检查数字存在性方面非常高效。在其他问题中,可能需要使用列表、集合、字典、树或图等。
  3. 优化算法: 分析算法的瓶颈,并寻找可能的优化方法。例如,避免不必要的排序操作,或者使用更高效的查找算法。
  4. 空间与时间的权衡: 在设计解决方案时,考虑空间和时间的权衡。有时候,增加一些额外的空间可以显著减少时间复杂度,反之亦然。
  5. 利用抽象化: 将复杂的问题抽象为更简单的模型。例如,将数字的存在状态抽象为位图,这样可以简化问题的表示和处理。
  6. 迭代和增量开发: 不要期望一次性找到完美的解决方案。通过迭代和增量开发,逐步改进你的解决方案。
  7. 考虑假设和约束: 明确问题的假设和约束,这有助于你设计出既高效又正确的解决方案。例如,如果输入的数字可能包含负数或超过N的数字,你需要相应地调整你的方法。
  8. 学习和应用算法知识: 掌握常见的算法和数据结构,这可以帮助你在面对新问题时快速找到合适的解决方案。
  9. 代码复用和模块化: 尽可能复用已有的代码和模块,这可以提高开发效率并减少错误。
  10. 测试和验证: 在实现解决方案后,进行彻底的测试和验证,确保它满足问题的所有需求。

通过应用这些技巧和策略,可以在面对各种编程问题时更加灵活和高效。记住,编程不仅仅是写代码,更是一种解决问题的艺术。


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

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

相关文章

嵌入式Linux系统编程 — 4.4 memset、bzero函数内存填充

目录 1 memset 函数 2 bzero函数 在编程中&#xff0c;经常需要将某一块内存中的数据全部设置为指定的值&#xff0c;譬如在定义数组、结构体这种类型变量时&#xff0c;通常需要对其进行初始化操作&#xff0c;而初始化操作一般都是将其占用的内存空间全部填充为 0。 1 me…

Pytorch课程论文设计参考

Pytorch下基于卷积神经网络的手写数字识别 论文格式 利用wps初步美化论文格式教程 wps论文格式变的的原因 格式变的根本原因是word为流式文件&#xff0c;就算同是word同一个版本不同电脑也会有可能变&#xff0c;字体变是因为没有嵌入字体然后观看的那台没有这个字体。 一、…

Redis和PHP的Bitmap于二进制串的相互转换

Redis和PHP的Bitmap于二进制串的相互转换 场景 错题集的存储&#xff0c;需要有正确的题号id集合&#xff0c;错误的题号id集合&#xff0c;两者并集后在全量题的集合中取反就是未答题号id 选型 基于场景的数据结构设计&#xff0c;有试过列表等&#xff0c;测试结果&#xff1…

confluence集成LDAP

一、confluence的权限管理 在集成前&#xff0c;我们必须得知道confluence自身的权限管理是如何做的。 用户组对应空间权限&#xff0c;用户组可以是一个项目&#xff0c;也可以是一个部门或组。 一个用户组里的用户&#xff0c;可以读写本空间的页面&#xff0c;而把其他组隔离…

力扣随机一题 6/28 数组/矩阵

&#x1f4dd;个人主页&#x1f339;&#xff1a;誓则盟约⏩收录专栏⏪&#xff1a;IT 竞赛&#x1f921;往期回顾&#x1f921;&#xff1a;6/27 每日一题关注博主&#xff0c;后期持续更新系列文章如果有错误感谢请大家批评指出&#xff0c;及时修改感谢大家点赞&#x1f44d…

真实案例解析!企业如何做好安全生产管理工作?

很多企业都有相对应的安全管理制度&#xff0c;安全管理系统&#xff0c;安全管理人员等等&#xff0c;但这都仅限于企业“做了”安全生产管理&#xff0c;并不能“做好”安全生产管理。其实做好安全生产管理需要安全管理系统的配合。 听说过EHS系统吗&#xff1f;这系统能帮企…

百元平价蓝牙耳机哪款好?揭秘百元高性价比蓝牙耳机推荐

如今&#xff0c;市面上的耳机种类繁多&#xff0c;有线、无线、降噪等功能让人眼花缭乱。而对于那些预算有限、但又希望享受无线便捷和高性价比的朋友们来说&#xff0c;百元左右的蓝牙耳机无疑是一个不错的选择。这类耳机不仅能够提供不错的音质体验&#xff0c;同时价格也十…

安宝特分享 | 数字化革命,AR技术打造智慧城市的未来

随着城市化进程的加速和科技创新的不断推进&#xff0c; AR技术正逐步融入智慧城市建设的方方面面&#xff0c;为城市居民提供更智能、便捷、舒适的生活体验&#xff0c;开启了智慧城市的新时代。 01 优化城市规划与建设 AR技术在城市规划和建设中发挥着重要作用。城市规划师和…

可以在Mac电脑玩的拳皇97 for Mac(KOF97) 支持M1

《拳皇97》&#xff08;The King of Fighters 97&#xff09;是一款由SNK公司制作的拳击格斗游戏&#xff0c;于1997年在Arcade平台发布&#xff0c;随后在多个游戏平台上推出。该游戏是《拳皇》系列的第三个作品&#xff0c;继承了前作《拳皇96》的“adius”系统&#xff0c;并…

chrome 配置允许跨域

目录 1.Chrome跨域插件配置 1.1启动插件 1.2. 设置本地调试跨域 2 Firefox跨域插件 2.1. 安装插件 CORS Everywhere 2.2. 启动插件 3 工具下载链接 1.Chrome跨域插件配置 使用chrome插件“Allow CORS: Access-Control-Allow-origin ”来解决跨域问题。 点击pin图标&…

东兴市金顺心贸易有限公司联合越南名厨研发的阿吉贡河粉灵魂汤底料

东兴市金顺心贸易有限公司联合越南名厨研发的阿吉贡河粉灵魂汤底料&#xff0c;一包汤底料竟然就能撑起一家店的灵魂&#xff01;&#x1f372; 简单的食材&#xff0c;却散发出不平凡的美味&#xff0c;仿佛带我穿越千里之外。每一口都是满满的幸福与满足&#xff0c;真心推荐…

element ui 的 el-date-picker 日期选择组件设置可选日期范围

有时候&#xff0c;在使用日历控件的时候&#xff0c;我们需要进行定制&#xff0c;控制用户只能在指定日期范围内进行日期选择&#xff0c;在这里&#xff0c;我使用了 element ui 的 el-date-picker 日期选择控件&#xff0c;控制只能选择当前月及往前的2个月&#xff0c;效果…

java 笔记 第十二章 集合(部分整理细化)

集合概述 &#xff08;1&#xff09;集合是存储其他对象的特殊对象。可以将集合当做一个容器。 &#xff08;2&#xff09;集合的相关接口和类位于java.util包中 &#xff08;3&#xff09;集合中的接口和类是一个整体、一个体系。 集合接口 接口定义了一组抽象方法&#x…

98%企业竟存N日漏洞超5年,新漏洞利用攻击时长极速缩短!

专注推动网络与安全融合的全球网络安全领导者 Fortinet&#xff08;NASDAQ&#xff1a;FTNT&#xff09;&#xff0c;近日发布 FortiGuard Labs&#xff08;Fortinet全球威胁情报响应与研究团队&#xff09;《2023 下半年全球威胁态势研究报告》。本次新发布的半年度研究报告&a…

使用Python进行Socket接口测试

大家好&#xff0c;在现代软件开发中&#xff0c;网络通信是不可或缺的一部分。无论是传输数据、获取信息还是实现实时通讯&#xff0c;都离不开可靠的网络连接和有效的数据交换机制。而在网络编程的基础中&#xff0c;Socket&#xff08;套接字&#xff09;技术扮演了重要角色…

python练习题2

python期考复习题 目录 1. 判断n**2的值每一位互不相同​编辑 2. 密码 3. 图书版号 4. 情感分类矩阵 5. 计算数对个数 1. 判断n**2的值每一位互不相同 def isdiff(n):sstr(n)for i in range(len(s)):for j in range(len(s)):if i!j:if s[i]s[j]:return Falsereturn Truel…

Python输入与输出基础

Python输入与输出基础 引言 Python是一种非常直观且功能强大的编程语言&#xff0c;它允许用户轻松地处理输入和输出操作。无论是从用户那里获取数据&#xff0c;还是将结果展示给用户&#xff0c;Python都提供了简单易用的函数和方法。 一、输入数据 在Python中&#xff0c…

LSTM理解

目录 一、LSTM的本质 二、LSTM的原理 三、LSTM的应用 本文将从LSTM的本质、LSTM的原理、LSTM的应用三个方面&#xff0c;带您一文搞懂长短期记忆网络Long Short Term Memory | LSTM。 一、LSTM的本质 RNN 面临问题&#xff1a;RNN&#xff08;递归神经网络&#xff09;在处理…

数字时代的软件架构:持续架构的兴起与架构师角色的转变

在数字化浪潮的推动下&#xff0c;软件架构领域正经历着前所未有的变革。Eoin Woods在《数字时代的软件架构》演讲中&#xff0c;深入探讨了这一变革&#xff0c;并提出了“持续架构”这一概念。本文将基于Eoin的观点&#xff0c;结合个人理解&#xff0c;探讨持续架构的重要性…

Kali系统的中英文切换

执行命令&#xff1a;sudo dpkg-reconfigure locales 命令作用&#xff1a;重新生成locales配置文件并允许你重新选择所需的语言环境。 中文&#xff1a;zh_CN.UTF-8 UTF-8 英文&#xff1a;en_US.UTF-8 UTF-8 用空格键选中和取消选项。 要设置成中文&#xff1a;取消选择en…