每日一题——Python实现PAT甲级1144 The Missing Number(举一反三+思想解读+逐步优化)四千字好文


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

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

Python-3.12.0文档解读

目录

我的写法

时间复杂度分析

空间复杂度分析

总体空间复杂度:O(N)

总结

我要更强

时间复杂度分析

空间复杂度分析

总结

哲学和编程思想

举一反三


题目链接

我的写法

# 接收一个整数N,表示输入的数字个数
N = int(input())

# 从输入中读取N个整数,并将它们转换为集合以去除重复项
nums = set(map(int, input().split()))

# 找出集合中的最大值
max_num = max(nums)

# 如果集合中的最大值小于等于0,那么返回1
if max_num <= 0:
    print('1')
    raise SystemExit(0)  # 提前终止程序,因为我们已经找到了答案

# 从1到最大值之间查找缺失的正整数
for i in range(1, max_num):
    if i not in nums:  # 如果当前数i不在集合中,输出这个数
        print(i)
        raise SystemExit(0)  # 提前终止程序,因为我们已经找到了答案

# 如果1到最大值之间的所有正整数都在集合中,返回最大值+1
print(max_num + 1)

这段代码实现了查找从1开始的最小正整数,该整数不在给定的整数集合中。下面是对这段代码的详细点评和分析:

时间复杂度分析

  • 输入处理:O(N)
    • 将N个数字读取并转换为集合需要O(N)时间。
  • 查找最大值:O(N)
    • 查找集合中的最大值需要遍历所有元素,时间复杂度为O(N)。
  • 检查缺失的正整数:O(max_num)
    • 在最坏情况下,需要从1检查到 max_num,每次检查集合中是否存在某个整数的时间为O(1),因此这一部分的时间复杂度为O(max_num)。
  • 总体时间复杂度:O(N + max_num)
  • 由于 max_num 最多不会超过N,因此时间复杂度可以表示为O(N)(假设输入的N个数字都是正数且没有重复)。

空间复杂度分析

  • 输入处理:O(N)
    • 输入N个数字并存储到集合中,需要O(N)的空间。
  • 其他部分:
  • 使用了几个常数级别的额外变量如 max_num 和 i,这些变量的空间复杂度为O(1)。

总体空间复杂度:O(N)

总结

这段代码高效地查找了最小的缺失正整数,逻辑清晰,处理了多种可能的输入情况。时间复杂度为O(N),空间复杂度也是O(N),对于一般的输入规模是可以接受的。此外,使用集合来存储输入数据,可以快速地进行查找操作,进一步优化了性能。唯一需要注意的是,在极端情况下,如果输入的数字范围非常大,可能会导致较高的空间开销。


我要更强

为了优化时间复杂度和空间复杂度,我们可以考虑以下几个策略:

  1. 使用数组代替集合:如果输入的数字范围有限,可以使用数组来标记数字是否出现,这样可以减少空间使用。
  2. 只关注正整数:我们只关心正整数的缺失,因此可以忽略非正整数,这样可以减少不必要的检查。
  3. 原地修改数组:使用输入的数组本身来标记数字是否出现,这样可以避免额外的空间使用。

下面是使用这些策略优化后的代码:

# 读取输入的数字个数
N = int(input())

# 读取输入的数字,并转换为列表
nums = list(map(int, input().split()))

# 使用一个数组来标记1到N之间的数字是否出现
# 初始化所有位置为False,表示数字未出现
present = [False] * N

# 遍历输入的数字,如果数字在1到N之间,则标记为True
for num in nums:
    if 1 <= num <= N:
        present[num - 1] = True

# 遍历标记数组,找到第一个未被标记的位置,即缺失的最小正整数
for i in range(N):
    if not present[i]:
        print(i + 1)
        raise SystemExit(0)

# 如果所有位置都被标记,则缺失的最小正整数是N+1
print(N + 1)

时间复杂度分析

  • 输入处理:O(N)
  • 标记数字:O(N)
  • 查找缺失的正整数:O(N)
  • 总体时间复杂度:O(N)

空间复杂度分析

  • 标记数组:O(N)
  • 总体空间复杂度:O(N)

总结

这段代码通过使用一个额外的数组来标记数字是否出现,优化了空间复杂度。同时,由于只关注1到N之间的数字,因此可以忽略输入中的非正整数,减少了不必要的检查。这种方法在输入数字的范围有限时非常有效,特别是在输入的数字都是正整数且范围不大于N时,可以达到O(N)的时间复杂度和空间复杂度。


哲学和编程思想

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

  1. KISS原则(Keep It Simple, Stupid):
    • 代码简洁明了,避免不必要的复杂性。例如,使用数组来标记数字是否出现,而不是使用更复杂的数据结构。
  2. YAGNI原则(You Ain't Gonna Need It):
    • 只实现当前需要的功能,不预先实现未来可能需要的功能。在代码中,我们只处理了当前输入的数字,没有预先考虑更大范围的数字。
  3. 空间与时间的权衡(Space-Time Tradeoff):
    • 在空间和时间之间做出权衡。使用额外的数组来标记数字是否出现,虽然增加了空间复杂度,但减少了时间复杂度,因为可以直接在O(1)时间内检查数字是否出现。
  4. 局部性原理(Principle of Locality):
    • 利用数据的局部性,假设输入的数字集中在一定的范围内。通过限制标记数组的大小为N,我们假设缺失的正整数不会超过N,这在很多实际情况下是合理的。
  5. 抽象与具体化:
    • 将问题抽象为更具体的形式。例如,将查找缺失的最小正整数问题抽象为在数组中查找第一个未被标记的位置。
  6. 优化与效率:
    • 追求代码的效率。通过原地修改数组和使用数组标记,我们减少了不必要的内存分配和数据复制,提高了程序的执行效率。
  7. 问题分解:
    • 将复杂问题分解为更小的、可管理的部分。在代码中,我们将问题分解为读取输入、标记数字和查找缺失数字三个部分。
  8. 算法优化:
    • 选择合适的算法来解决问题。在这个例子中,我们选择了基于数组的标记算法,这是一种简单而高效的方法。
  9. 数据驱动:
  • 根据数据的特性来设计解决方案。由于我们假设输入的数字都是正整数且范围不大于N,因此我们可以设计一个基于这个假设的优化方案。

通过这些哲学和编程思想的应用,能够设计出更加高效、简洁且易于理解的代码。这些思想不仅适用于这个特定的例子,也适用于更广泛的编程和软件开发领域。


举一反三

基于上述哲学和编程思想,以下是一些技巧和策略,可以帮助在编程和问题解决中举一反三:

  1. 简化问题:
    • 在开始编码之前,尝试简化问题。去掉非必要的部分,专注于核心需求。
    • 使用简单的数据结构和算法,避免过早优化。
  2. 避免过度设计:
    • 不要预先实现不需要的功能。根据实际需求逐步构建系统。
    • 保持代码的灵活性和可扩展性,但只在必要时进行扩展。
  3. 权衡时间和空间:
    • 在设计算法时,考虑时间和空间的平衡。有时候,牺牲一点空间可以显著减少时间复杂度。
    • 分析问题的特性,选择最合适的数据结构和算法。
  4. 利用局部性原理:
    • 如果数据具有局部性,考虑使用缓存或预取技术来提高性能。
    • 在处理大量数据时,考虑数据的分块处理,以减少内存使用和提高处理速度。
  5. 抽象问题:
    • 将复杂问题分解为更小的、可管理的部分。每个部分应该有一个清晰的目标和接口。
    • 使用抽象数据类型(ADTs)来隐藏实现细节,提高代码的可读性和可维护性。
  6. 追求效率:
    • 在编码时,始终考虑性能。避免不必要的循环和递归,减少函数调用的开销。
    • 使用合适的数据结构来存储和操作数据,例如使用哈希表进行快速查找。
  7. 问题分解:
    • 将大问题分解为小问题,逐步解决。每个小问题解决后,再整合起来解决整个问题。
    • 使用模块化和分层设计,将代码组织成易于管理和测试的单元。
  8. 算法优化:
    • 学习和掌握常见的算法和数据结构,了解它们的时间和空间复杂度。
    • 在解决问题时,尝试找到最优的算法,或者对现有算法进行改进。
  9. 数据驱动:
  • 分析数据的特性,根据数据的特点选择或设计合适的算法。
  • 在处理数据密集型任务时,考虑数据预处理和后处理步骤,以提高算法的效率。

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


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

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

相关文章

洗地机什么牌子耐用?四款高品质洗地机型号强烈安利

在快节奏的现代生活中&#xff0c;保持家庭清洁成为了许多人的挑战。传统的清洁方式不仅耗时费力&#xff0c;还难以彻底清洁地板上的污渍和毛发。特别是对于有宠物的家庭&#xff0c;毛发的清理更是让人头疼。如果有一款洗地机&#xff0c;既能高效清洁又能省时省力&#xff0…

Matlab|风光及负荷多场景随机生成与缩减

目录 1 主要内容 计算模型 场景生成与聚类方法应用 2 部分程序 3 程序结果 4 下载链接 1 主要内容 该程序方法复现了《融合多场景分析的交直流混合微电网多时间尺度随机优化调度策略》3.1节基于多场景技术的随机性建模部分&#xff0c;该部分是随机优化调度的重要组成部分…

从0到1构建自己的短链接系统

1. 短链系统简介 1.1 短链系统的定义与用途 短链系统是指将一个较长的URL地址&#xff0c;通过特定的算法生成一个较短的、具备唯一性的URL地址。这种系统广泛应用于社交网络、短信、邮件营销等场景&#xff0c;它能帮助用户在字数受限的情况下分享链接&#xff0c;并且还具有…

6-47选择整数计算

整数计算&#xff1a; 用swing组件来实现整数计算&#xff0c;需要对整数计算的值进行校验。 import javax.swing.*; import java.awt.*; import java.awt.event.*;public class IntegerCalculator extends JFrame implements ActionListener {private JCheckBox[] checkBoxe…

老杨说运维 | 基于业务全链路的端到端排障分析(文末附现场视频)

前言 青城山脚下的滔滔江水奔涌而过&#xff0c;承载着擎创一往无前的势头&#xff0c;共同去向未来。2024年6月&#xff0c;双态IT成都用户大会擎创科技“数智化可观测赋能双态运维”专场迎来了完满的收尾。 本期回顾来自擎创科技产品总监殷传旺的现场演讲&#xff1a;云原生…

封装了一个iOS联动滚动效果

效果图 实现逻辑和原理 就是在 didEndDisplayingCell 方法中通过indexPathsForVisibleItems 接口获取当前可见的cell对应的indexPath&#xff0c; 然后获取到item最小的那一个&#xff0c;即可&#xff0c;同时&#xff0c;还要在 willDisplayCell 方法中直接设置标题的选中属…

代码随想录算法训练营第三十四天|56. 合并区间、738.单调递增的数字、968.监控二叉树

56. 合并区间 题目链接&#xff1a;56. 合并区间 文档讲解&#xff1a;代码随想录 状态&#xff1a;无语&#xff0c;这题从右边界排序做不了&#xff01; 思路&#xff1a; 排序&#xff1a;按照区间的起始位置进行排序&#xff0c;这样后面处理时可以顺序合并重叠区间。合并…

Cortex-M Fault

Cortex-M CPU 会在系统发生故障时引发异常。非法内存写入和读取、访问未通电的外设、执行无效指令、除以零以及其他问题都可能导致此类异常。通常在所有情况下都会引发 HardFault 异常。对于某些故障&#xff0c;可以启用不同的异常来专门处理这些情况。 Cortex-M 故障异常 …

剪画小程序:视频文案提取神器:制作爆款视频的第一步!

在这个信息爆炸的时代&#xff0c;视频成为了我们获取知识和娱乐的重要途径。 但有时候&#xff0c;我们想要的不仅仅是观看视频&#xff0c;而是能够将其中精彩的文案提取出来&#xff0c;为自己的创作添砖加瓦。 现在&#xff0c;有一款神奇的工具应运而生&#xff0c;为您…

Linux-笔记 全志T113移植正点4.3寸RGB屏幕笔记

目录 前言 线序整理 软件 显示调试 触摸调试 背光调试 前言 由于手头有一块4.3寸的RGB屏幕(触摸IC为GT1151)&#xff0c;正好开发板上也有40Pin的RGB接口&#xff0c;就想着给移植一下&#xff0c;前期准备工作主要是整理好线序&#xff0c;然后用转接板与杜邦线连接验证好…

Vitis Accelerated Libraries 学习笔记--Vision 库的组织结构

1. 简介 Vision 库的组织结构如下&#xff1a; ├── L1/ │ ├── README.md │ ├── examples/ │ ├── include/ │ ├── lib/ │ └── tests/ ├── L2/ │ ├── README.md │ ├── examples/ │ └── tests/ ├── L3/ │ ├── R…

突破架构瓶颈:克服软件系统中的漂移和侵蚀

一种常见但不完美的比喻是将软件系统中的架构漂移和侵蚀与物理建筑的架构相比。虽然这个比喻很直观&#xff0c;但它存在一个根本性的误解&#xff0c;这也常常引发软件开发中的架构问题。 试想一下&#xff0c;一个设计良好的摩天大楼或房屋建成后&#xff0c;我们期望它基本保…

本地电脑配置不足,对工业仿真计算有哪些影响?

工业仿真计算对电脑的要求相对较高&#xff0c;这主要是因为仿真过程涉及到大量的数据处理和复杂的计算任务。一个高效的工业仿真系统需要强大的计算能力和稳定的运行环境&#xff0c;以确保仿真的准确性和实时性。 工业仿真对电脑配置有哪些要求 首先&#xff0c;工业仿真计算…

Prompt 提示词工程:翻译提示

近期在对计算机学习时&#xff0c;许多内容需要看原始的英文论文&#xff0c;对于我这种学渣来说特别不友好&#xff0c;&#x1f937;&#x1f3fb;‍♀️无奈只能一边看翻译&#xff0c;一边学习。 之前有搜到过专门的翻译工具&#xff0c;无奈都是按照字数算费用的&#xf…

都2024年了,现在互联网行情怎样?

都2024年了&#xff0c;互联网行情是怎样的&#xff1f; 很直白的说&#xff0c;依旧是差得很&#xff0c;怎么说&#xff1f; 我刚在掘金上看到一个掘友写的文章&#xff0c;他是四月领了大礼包&#xff0c;据他的描述如下&#xff1a; 互联网行情依旧是差得很&#xff0c;很…

自编码器笔记

编码器解码器自编码器 先压缩特征&#xff0c;再通过特征还原。 判断还原的和原来的是否相等 encode data 在一个“潜在空间”里。它的用途是“深度学习”的核心-学习数据的特征并简化数据表示形式以寻找模式。 变分自编码器&#xff1a; 1. 首先、假设输入数据是符合正态分布…

DDL-表操作-数据类型

一.DDL-表操作-数据类型 MySQL中的数据类型有很多,主要分为三类:数值类型,字符串类型,日期类型。 二.关系表 注意: 无符号和有符号的取值范围不是一样的,无符号需要加上UNSIGNED范围。 BLOB&#xff1a;用来描述二进制数据 TEXT:用来描述字符串 三.定长字符串和变长字符串 c…

【UE5.3】笔记1

内容浏览器&#xff1a;存放项目中所有的资源&#xff1a;关卡、蓝图类...... 关卡--Map 至少有一个关卡&#xff0c;可以有多个关卡 -漫游 视野漫游&#xff1a;鼠标右键WASD QE 鼠标滑轮控制摄像机速度 运行&#xff0c;ESC退出运行,快捷键F8不停止运行单独弹出功能 -创…

2024年第十五届蓝桥杯青少组大赛8月24日开启

据蓝桥杯青少组官网显示&#xff0c;2024年第十五届蓝桥杯青少组大赛8月24日开启。 蓝桥杯青少组历届题库地址&#xff1a;http://www.6547.cn/question/cat/2 蓝桥杯青少组历届真题下载&#xff1a;http://www.6547.cn/wenku/list/10

统一视频接入平台LntonCVS视频共享交换平台智慧景区运用方案

随着夏季的到来&#xff0c;各地景区迎来了大量游客&#xff0c;而景区管理面临的挑战也愈加严峻&#xff0c;尤其是安全问题显得格外突出。 视频监控在预防各类安全事故方面发挥着重要作用&#xff0c;不论是自然景区还是人文景区&#xff0c;都潜藏着诸多安全隐患&#xff0…