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

news2024/11/25 5:03:36


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

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

Python-3.12.0文档解读

目录

 我的写法

时间复杂度:

空间复杂度:

我要更强

时间复杂度分析:

空间复杂度分析:

哲学和编程思想

举一反三


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

 我的写法

import os
import sys


N=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:  # 确保数字不超过N
        bitmap[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.coloradmin.cn/o/1872414.html

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

相关文章

Flutter循序渐进==>与基金mysql数据库交互

导言 债基基金的注意事项&#xff0c;别看收益不高&#xff0c;注意事项可真不少。最近买了CS一支基金&#xff0c;三周时间就亏掉两三个点&#xff08;水平全网最差、赎回费和管理费全网最高&#xff09;。就是冲着它的历史成绩去的&#xff0c;突然发现已经换了基金经理&…

向日葵API集成服务:三大优势助力企业搭建专属远控方案

为了方便企业用户更加灵活的搭建满足各自需求的软件解决方案&#xff0c;降低开发和部署门槛&#xff0c;很多软件方案供应商提供了多样化的合作模式。 以贝锐向日葵远程控制为例&#xff0c;他们就向客户提供了基础的SaaS服务模式、私有化部署模式、SDK嵌入模式&#xff0c;以…

第二证券:近300亿资金抄底,低估值+高增长“错杀”股名单来了,仅11只

成绩表现优质公司或存在“错杀”的状况。 头部宽基ETF成交额继续放量&#xff0c;近300亿资金抄底 6月21日&#xff0c;上证指数跌破3000点后&#xff0c;商场谨慎情绪延伸&#xff0c;成交量继续走低&#xff0c;本周4个交易日均缺乏7000亿元。 关于3000点以下的地量行情&a…

推荐系统中冷启动环节的设计实现

目录 推荐系统中冷启动环节的设计实现 推荐系统中冷启动环节的设计实现 唐楠烊 [IT阅读排行榜](javascript:void(0)&#x1f609; 2024-06-28 07:15 北京 推荐系统中的冷启动分为物料冷启动和用户冷启动。用户冷启动主要是针对新用户&#xff0c;但有时候也用于低活用户拉活。…

CVPR24已开源:刷新监督学习SOTA,无监督多目标跟踪时代来临!

论文标题&#xff1a; Matching Anything by Segmenting Anything 论文作者&#xff1a; Siyuan Li, Lei Ke, Martin Danelljan, Luigi Piccinelli, Mattia Segu, Luc Van Gool, Fisher Yu 导读&#xff1a; 在计算机视觉的征途中&#xff0c;多目标跟踪&#xff08;MOT&…

武汉凯迪正大—漆包圆线软化击穿试验仪 漆包线检测仪器

产品功能 武汉凯迪正大电气有限公司生产KDZD-JC软化击穿试验仪用于检测3.00mm及以下漆包线在热状态下漆膜软化后的绝缘性能&#xff0c;根据设定的预热温度、试验时间、仪器自动完成对试样的预加热、加负荷、加试验电压&#xff0c;达到试验时间或试样被击穿时即卸负荷&#x…

您渴望提升交易技能吗?

您渴望提升交易技能吗&#xff1f;Eagle Trader就是您的理想选择&#xff01;我们精心设计了多样化的挑战&#xff0c;配备真实数据模拟交易环境&#xff0c;让您轻松精进交易技术。更有精选交易工具和卓越服务助您一臂之力&#xff0c;优化策略&#xff0c;洞察市场&#xff0…

锂电池的串并联特性

1节锂电池电芯的规格是10000mah&#xff0c;4v&#xff08;总能量10000*4&#xff09; 那么3节电芯串联电池的规格是10000mah&#xff0c;12v&#xff08;总能量10000*12&#xff09;注意&#xff0c;这里电池的规格不是30000mah 3节电芯并联的规格是30000mah&#xff0c;4v …

【数据采集】亮数据浏览器、亮网络解锁器实战指南

前言 继上次我们写了数据采集与AI分析&#xff0c;亮数据通义千问助力跨境电商前行的文章之后&#xff0c;好多小伙伴来后台留言&#xff0c;表示对亮数据的数据采集非常感兴趣&#xff0c;并且感觉用起来非常顺手&#xff0c;大大减少了小白用户获取数据的成本。 在这儿&…

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

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

Debian linux忘记root密码如何重置

重启电脑, 到下图再按 e 键 在页面中可以看到有个ro的行&#xff0c;在ro行的尾部&#xff0c;添加 rw init/bin/bas 3. ctrl X 启动系统&#xff0c;最后会进入命令行模式 4. 重设root密码&#xff0c;输入命令 passwd root&#xff0c;按照提示输入新密码并确认 5. 重启系…

Spring项目报错解读与全部报错详解

你好,我是Qiuner. 为帮助别人少走弯路和记录自己编程学习过程而写博客 这是我的 github https://github.com/Qiuner ⭐️ ​ gitee https://gitee.com/Qiuner &#x1f339; 如果本篇文章帮到了你 不妨点个赞吧~ 我会很高兴的 &#x1f604; (^ ~ ^) 想看更多 那就点个关注吧 我…

智能语音热水器:置入NRK3301离线语音识别ic 迈向智能家居新时代

一、热水器语音识别芯片开发背景 在科技的今天&#xff0c;人们对于生活品质的追求已不仅仅满足于基本的物质需求&#xff0c;更渴望通过智能技术让生活变得更加便捷、舒适。热水器作为家庭生活中不可或缺的一部分&#xff0c;其智能化转型势在必行。 在传统热水器使用中&#…

ProfibusDP主站转Modbus模块连接称重仪配置案例

在工业自动化领域&#xff0c;常常需要将不同协议的设备进行连接。比如&#xff0c;将ProfibusDP主站转Modbus模块&#xff08;XD-MDPBM20&#xff09;用于连接称重仪&#xff0c;可以实现不同设备之间的数据交换和通信。ProfibusDP主站转Modbus网关&#xff08;XD-MDPBM20&…

一站式AI服务平台:MaynorAI助您轻松驾驭人工智能

一站式AI服务平台&#xff1a;MaynorAI助您轻松驾驭人工智能 在当前的数字化时代&#xff0c;人工智能&#xff08;AI&#xff09;技术已经成为推动各行各业创新发展的核心动力。为了更好地满足企业和个人用户对AI服务的需求&#xff0c;MaynorAI 作为一个领先的一站式调用国内…

万物皆可爬——亮数据代理IP+Python爬虫批量下载百度图片助力AI训练

&#x1f482; 个人网站:【 摸鱼游戏】【神级代码资源网站】【导航大全】&#x1f91f; 一站式轻松构建小程序、Web网站、移动应用&#xff1a;&#x1f449;注册地址&#x1f91f; 基于Web端打造的&#xff1a;&#x1f449;轻量化工具创作平台&#x1f485; 想寻找共同学习交…

我用低代码平台自己搭建了一套MES应用系统,1天搞定!

MES系统是什么 MES系统是一套面向制造企业车间执行层的生产信息化管理系统。它能够为操作人员和管理人员提供计划的执行、跟踪以及所有资源&#xff08;包括人、设备、物料、客户需求等&#xff09;的当前状态。通过MES系统可以对从订单下达到产品完成的整个生产过程进行优化管…

2024年6月大众点评深圳餐饮店铺POI分析18万家

2024年6月大众点评深圳餐饮店铺POI共有178720家 店铺POI点位示例&#xff1a; 店铺id G9TSD2JvdLtA7fdm 店铺名称 江味龙虾馆(南山店) 十分制服务评分 8.8 十分制环境评分 8.8 十分制划算评分 8.6 人均价格 128 评价数量 12840 店铺地址 南山大道与桂庙路交叉口西北角…

vue3 【提效】使用 CSS 框架 UnoCSS 实用教程

该换种更高效的方式写 CSS 啦&#xff0c;举个例&#xff1a; <div class"flex"> </div>相当于 <div class"flex"> </div> <style> .flex {display: flex; } </style>当然&#xff0c;还有超多强大的功能帮我们提升…

MySQL事务:ACID特性的实现原理

事务是MySQL等关系型数据库区别于NoSQL的重要方面&#xff0c;是保证数据一致性的重要手段。本文将首先介绍MySQL事务相关的基础概念&#xff0c;然后介绍事务的ACID特性&#xff0c;并分析其实现原理。 一、基础概念 事务&#xff08;Transaction&#xff09;是访问和更新数…