每日一题——8行Python代码实现PAT乙级1029 旧键盘(举一反三+思想解读+逐步优化)五千字好文


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

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

Python-3.12.0文档解读

目录

​编辑我的写法

代码分析

时间复杂度分析

空间复杂度分析

改进建议

方法 1:原地修改法

分析

方法 2:使用双指针

分析

方法 3:递归法

分析

方法 4:迭代法

分析

哲学和编程思想

1. 原地算法(In-Place Algorithm)

2. 迭代(Iteration)

3. 递归(Recursion)

4. 双指针(Two Pointers)

5. 分治法(Divide and Conquer)

6. 优化(Optimization)

7. 简洁性(Simplicity)

举一反三

1. 原地算法(In-Place Algorithm)

2. 迭代(Iteration)

3. 递归(Recursion)

4. 双指针(Two Pointers)

5. 分治法(Divide and Conquer)

6. 优化(Optimization)

7. 简洁性(Simplicity)

实践建议


题目链接

我的写法

class Solution:def plusOne(self, digits: List[int]) -> List[int]:str_num=''for digit in digits:str_num+=str(digit)return [int(digit) for digit in str(int(str_num)+1)]

这段代码定义了一个名为 Solution 的类,其中包含一个方法 plusOne,该方法接受一个整数列表 digits 作为输入,并返回一个新的整数列表。这个方法的目的是将列表中的数字视为一个整数,然后加1,最后将结果转换回整数列表。

代码分析

  1. 字符串拼接:首先,代码通过遍历输入的整数列表 digits,将每个整数转换为字符串,并拼接成一个完整的字符串 str_num。
  2. 整数加法:接着,将字符串 str_num 转换为整数,加1,然后再转换回字符串。
  3. 列表生成:最后,使用列表推导式将字符串中的每个字符转换为整数,并返回这个整数列表。

时间复杂度分析

  • 字符串拼接:遍历整个 digits 列表,时间复杂度为 O(n),其中 n 是列表的长度。
  • 整数加法和转换:这部分操作的时间复杂度可以视为常数 O(1)。
  • 列表生成:再次遍历字符串,时间复杂度为 O(n)。

因此,总的时间复杂度为 O(n) + O(1) + O(n) = O(n)。

空间复杂度分析

  • 字符串 str_num:需要额外的空间来存储字符串,空间复杂度为 O(n)。
  • 中间变量:整数加法和转换过程中使用的中间变量空间复杂度为 O(1)。
  • 结果列表:最终生成的列表空间复杂度为 O(n)。

因此,总的空间复杂度为 O(n) + O(1) + O(n) = O(n)。

改进建议

这段代码虽然实现了功能,但可以通过更直接的方式来优化,避免不必要的字符串转换和拼接。例如,可以直接在整数列表上进行操作,通过模拟进位的方式来实现加1的操作,这样可以减少空间的使用,并且可能提高执行效率。

这种方法的时间复杂度仍然是 O(n),但空间复杂度优化到了 O(1),因为它避免了额外的字符串和列表生成。


我要更强

对于这个问题,直接将整数列表视为一个大整数加1,并不需要复杂的操作。最有效的方法依然是逐位处理进位,虽然时间复杂度已经是最优的 O(n),但可以在空间上再做优化。下面我会给出几种不同的优化方法,尽量降低空间复杂度和时间复杂度。

方法 1:原地修改法

这是通过原地修改输入列表来实现加1操作,同时确保空间复杂度保持在 O(1)。

class Solution:def plusOne(self, digits: List[int]) -> List[int]:n = len(digits)for i in range(n - 1, -1, -1):if digits[i] < 9:digits[i] += 1return digitsdigits[i] = 0# 处理进位到新的最高位return [1] + [0] * n
分析
  • 时间复杂度:O(n)
  • 空间复杂度:O(1)(不考虑输入和输出空间)

方法 2:使用双指针

双指针的方法可以避免不必要的遍历,但在这种特定问题上,双指针的优化空间不大。

class Solution:def plusOne(self, digits: List[int]) -> List[int]:left, right = 0, len(digits) - 1while right >= 0:if digits[right] < 9:digits[right] += 1return digitsdigits[right] = 0right -= 1return [1] + [0] * len(digits)
分析
  • 时间复杂度:O(n)
  • 空间复杂度:O(1)(不考虑输入和输出空间)

方法 3:递归法

递归法可以优雅地处理进位问题,但在空间上会因为递归深度而增加。

class Solution:def plusOne(self, digits: List[int]) -> List[int]:def helper(index):if index < 0:return [1] + digitsif digits[index] < 9:digits[index] += 1return digitsdigits[index] = 0return helper(index - 1)return helper(len(digits) - 1)
分析
  • 时间复杂度:O(n)
  • 空间复杂度:O(n)(由于递归调用栈)

方法 4:迭代法

迭代法是最为常见且高效的方法。

class Solution:def plusOne(self, digits: List[int]) -> List[int]:for i in range(len(digits) - 1, -1, -1):if digits[i] < 9:digits[i] += 1return digitsdigits[i] = 0return [1] + [0] * len(digits)
分析
  • 时间复杂度:O(n)
  • 空间复杂度:O(1)(不考虑输入和输出空间)

以上几种方法中,方法 1 和方法 4 都是时间复杂度为 O(n),空间复杂度为 O(1)。递归法虽然优雅,但递归深度会影响空间复杂度,通常不推荐用于这种简单的线性问题。


哲学和编程思想

这些方法体现了多种哲学和编程思想,具体包括:

1. 原地算法(In-Place Algorithm)

  • 哲学思想:最小化额外空间的使用,强调资源的高效利用。
  • 编程思想:通过修改输入数据本身来减少对额外空间的需求。在方法1和方法4中,我们直接修改输入的digits列表,而不是创建一个新的列表来存储结果。

2. 迭代(Iteration)

  • 哲学思想:通过重复执行一组操作来解决问题,强调逐步逼近解决方案。
  • 编程思想:使用循环结构(如for或while循环)来重复执行代码块,直到满足某个条件。在方法1、方法4和方法2中,我们使用迭代来遍历整数列表并处理进位。

3. 递归(Recursion)

  • 哲学思想:将复杂问题分解为更简单的子问题,强调问题的分解和层次化解决。
  • 编程思想:通过调用自身来解决问题,每次调用都解决问题的较小部分。在方法3中,我们使用递归来处理进位,每次递归调用处理一个较低位的加法。

4. 双指针(Two Pointers)

  • 哲学思想:通过同时从两端处理数据来提高效率,强调对问题的深入理解和针对性解决方案。
  • 编程思想:使用两个指针分别指向数据结构的不同位置,通常用于数组或链表问题。在方法2中,我们使用双指针来减少不必要的遍历。

5. 分治法(Divide and Conquer)

  • 哲学思想:将大问题分解为小问题,分别解决后再合并结果,强调问题的分解和合并。
  • 编程思想:虽然在这个特定问题中没有直接使用分治法,但递归的思想与分治法紧密相关。递归通常涉及将问题分解为更小的子问题,然后解决这些子问题。

6. 优化(Optimization)

  • 哲学思想:追求算法效率的最大化,强调性能和资源的最佳利用。
  • 编程思想:通过选择最合适的算法和数据结构来提高程序的运行效率。在所有方法中,我们都试图通过减少不必要的操作和空间使用来优化解决方案。

7. 简洁性(Simplicity)

  • 哲学思想:追求代码的简洁性和可读性,强调清晰和易于理解的解决方案。
  • 编程思想:编写简洁、直观的代码,避免不必要的复杂性。方法1和方法4的代码相对简单,易于理解和维护。

这些哲学和编程思想不仅适用于这个问题,也是编程和算法设计中的通用原则,可以帮助开发者更有效地解决问题。


举一反三

1. 原地算法(In-Place Algorithm)

  • 技巧:尽量通过修改输入数据或现有数据结构来解决问题,而不是创建新的数据结构。这可以减少内存使用并提高效率。
  • 应用:在处理数组或列表问题时,考虑是否可以通过交换元素或修改元素值来达到目的,而不是创建新的数组。

2. 迭代(Iteration)

  • 技巧:使用循环结构来重复执行一组操作,直到满足某个条件。
  • 应用:在需要重复执行相同或类似操作的问题中,使用for循环、while循环或迭代器来简化代码。

3. 递归(Recursion)

  • 技巧:将问题分解为更小的子问题,并通过递归调用解决这些子问题。
  • 应用:在处理可以自然分解为子问题的问题时,考虑使用递归。例如,树或图的遍历、分治算法等。

4. 双指针(Two Pointers)

  • 技巧:使用两个指针从不同方向遍历数据结构,以减少遍历次数或找到特定条件下的解决方案。
  • 应用:在数组或链表问题中,当需要找到两个元素之间的关系时,考虑使用双指针技巧。

5. 分治法(Divide and Conquer)

  • 技巧:将大问题分解为小问题,分别解决后再合并结果。
  • 应用:在处理可以自然分解为独立子问题的问题时,使用分治法。例如,快速排序、归并排序等。

6. 优化(Optimization)

  • 技巧:选择最合适的算法和数据结构,以提高程序的运行效率。
  • 应用:在设计算法时,考虑时间复杂度和空间复杂度,选择最优的解决方案。

7. 简洁性(Simplicity)

  • 技巧:编写简洁、直观的代码,避免不必要的复杂性。
  • 应用:在编写代码时,尽量使代码清晰易懂,避免过度设计。使用有意义的变量名和函数名,保持代码结构的一致性。

实践建议

  • 学习经典算法和数据结构:了解和掌握常见的算法和数据结构,如排序算法、搜索算法、树、图等。
  • 解决实际问题:通过解决实际问题来应用这些技巧,例如通过在线编程挑战或项目实践。
  • 代码审查和重构:定期审查自己的代码,寻找改进的机会,重构代码以提高其质量和效率。
  • 学习他人的解决方案:查看其他人在类似问题上的解决方案,学习他们的方法和技巧。

通过实践这些技巧,能够更好地理解和应用各种编程和算法设计思想,从而在面对新问题时能够灵活运用,举一反三。


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

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

相关文章

leetcode33:搜索旋转数组

题目链接&#xff1a;33. 搜索旋转排序数组 - 力扣&#xff08;LeetCode&#xff09; class Solution { public:int search(vector<int>& nums, int target) {int n (int)nums.size();if(!n){return -1;}if(n 1){return nums[0] target ? 0 : -1;}int left 0, …

Java开发笔记Ⅲ (一些零碎记录)

一些报错处理 找不到注入的对象 可以在 dao 层 的接口上添加 Repository 注解 common 模块报错 Unable to find main class 由于common中只有一些常量与工具类&#xff0c;不需要主类&#xff0c;故出现该错误时只需删除pom文件中的build标签即可解决 网关模块报错 Failed…

正则表达式常用表示

视频教程&#xff1a;10分钟快速掌握正则表达式 正则表达式在线测试工具&#xff08;亲测好用&#xff09;&#xff1a;测试工具 正则表达式常用表示 限定符 a*&#xff1a;a出现0次或多次a&#xff1a;a出现1次或多次a?&#xff1a;a出现0次或1次a{6}&#xff1a;a出现6次a…

网络安全:探索云安全的最佳实践

文章目录 网络安全&#xff1a;探索云安全的最佳实践引言云安全简介云安全面临的挑战云安全的最佳实践数据加密身份和访问管理定期安全审计 结语 网络安全&#xff1a;探索云安全的最佳实践 引言 在我们之前的文章中&#xff0c;我们讨论了网络安全的多个方面&#xff0c;包括…

2021数学建模A题目–“FAST”主动反射面的形状调节

A 题——“FAST”主动反射面的形状调节 思路&#xff1a;该题主要是通过利用伸缩杆调整FAST反射面&#xff0c;给出合适的调整方案 程序获取 第一题问题思路与结果&#xff1a; 当待观测天体S位于基准球面正上方&#xff0c;结合考虑反射面板调节因素&#xff0c;确定理想抛物…

等保2.0中,如何理解和实施安全管理中心的支持作用?

等保2.0&#xff0c;即《信息安全技术 网络安全等级保护基本要求》的第二版&#xff0c;是中国关于网络安全保护的一项重要标准。它强调了一个中心和三重防护的概念&#xff0c;其中的“一个中心”指的就是安全管理中心&#xff08;Security Management Center,简称SMC&#xf…

代理四川公司疑难商标办理商标异议复审办理

申请商标注册或者办理其他商标事宜&#xff0c;可以自行办理&#xff0c;也可以委托依法设立的商标代理机构办理。外国人或者外国企业在中国申请商标注册和办理其他商标事宜的&#xff0c;应当委托依法设立的商标代理机构办理&#xff0c;按照被代理人的委托办理商标注册申请或…

【串口通信-USART】

串口通信 前言一、串行通信和并行通信二、波特率三、USRAT如何实现USART 四、通信的时候共地五、奇偶校验位总结 前言 大三上时候的笔记⇨32入门-串口通信-发送和接收数据&#x1f31f;更加偏向32部分的吧。 大三上左右的时候写过串口通信的笔记&#xff0c;那时候虽然青涩啥也…

物联网协议应用

目录 前言一、WIFI简介二、NTP协议2.1 NTP简介2.2 NTP实现 三、HTTP协议3.1 HTTP协议简介3.2 HTTP服务器 四、MQTT协议4.1 MQTT协议简介4.1.1 MQTT通信模型4.1.2 MQTT协议实现原理4.1.3 MQTT 控制报文 4.2 移植MQTT协议 前言 本文主要介绍一下物联网协议如NTP协议、HTTP协议和M…

Go Gin框架

一、Gin介绍 Gin是一个用Go编写的HTTPweb框架。它是一个类似于martini但拥有更好性能的API框架, 优于httprouter&#xff0c;速度提高了近 40 倍。点击此处访问Gin官方中文文档。 二、安装 1、安装Gin go get -u github.com/gin-gonic/gin 2、代码中引入 import "githu…

整数转换00

题目链接 整数转换 题目描述 注意点 A&#xff0c;B范围在[-2147483648, 2147483647]之间 解答思路 比较A、B每一个数位是否相同&#xff0c;如果不同则res 1比较每一位的方法是&#xff1a;将数字右移i位&#xff0c;再将其与1进行’&操作&#xff0c;就可以得到数字…

《逆贫大叔》:一部穿越时光的温情史诗

《逆贫大叔》&#xff1a;一部穿越时光的温情史诗 在历史的长河中&#xff0c;有些故事能够穿越时光的尘埃&#xff0c;直击人心。《逆贫大叔》就是这样一部作品&#xff0c;它不仅是一部电视剧&#xff0c;更是一段历史的缩影&#xff0c;一次心灵的触动。 背景设定&#xff1…

HTML静态网页成品作业(HTML+CSS)——企业摄影网介绍网页(3个页面)

&#x1f389;不定期分享源码&#xff0c;关注不丢失哦 文章目录 一、作品介绍二、作品演示三、代码目录四、网站代码HTML部分代码 五、源码获取 一、作品介绍 &#x1f3f7;️本套采用HTMLCSS&#xff0c;未使用Javacsript代码&#xff0c;共有3个页面。 二、作品演示 三、代…

金融科技在资产管理领域的创新实践

一、引言 随着科技的飞速发展&#xff0c;金融科技&#xff08;FinTech&#xff09;逐渐渗透到金融行业的各个领域&#xff0c;资产管理作为金融行业的核心之一&#xff0c;也迎来了金融科技带来的深刻变革。金融科技不仅改变了资产管理的传统模式&#xff0c;也极大地提高了资…

iOS ------ 对象的本质

一&#xff0c;OC对象本质&#xff0c;用clang编译main.m OC对象结构都是通过基础的C/C结构体实现的&#xff0c;我们通过创建OC文件及对象&#xff0c;将OC对象转化为C文件来探寻OC对象的本质。 代码&#xff1a; interface HTPerson : NSObject property(nonatomic,strong)…

MySQL全解(基础)-(MySQL的安装与配置,数据库基础操作(CRUD,聚合,约束,联合查询),索引,事务)

MySQL安装与配置 1.数据库介绍 存储数据用文件就可以了&#xff0c;为什么还要弄个数据库? 文件保存数据有以下几个缺点&#xff1a; 文件的安全性问题 文件不利于数据查询和管理 文件不利于存储海量数据 文件在程序中控制不方便数据库存储介质&#xff1a; 磁盘 内存 为了…

Python酷库之旅-比翼双飞情侣库(15)

目录 一、xlrd库的由来 二、xlrd库优缺点 1、优点 1-1、支持多种Excel文件格式 1-2、高效性 1-3、开源性 1-4、简单易用 1-5、良好的兼容性 2、缺点 2-1、对.xlsx格式支持有限 2-2、功能相对单一 2-3、更新和维护频率低 2-4、依赖外部资源 三、xlrd库的版本说明 …

QT基础 - 布局管理器间隔控件

目录 一. QVBoxLayout 二. QHBoxLayout 三. QGridLayout 四. QFormLayout 五. Spacers 六.总结 一. QVBoxLayout QVBoxLayout 主要用于将控件在垂直方向上进行排列。 它具有以下特点&#xff1a; 可以方便地管理和组织控件&#xff0c;使其按照垂直顺序依次排列。能够自动…

tensorboard基本使用

tensorboard基本介绍 conda下安装tensorboard 使用conda安装 conda install tensorboard2、tensorboard的基本使用 1、创建一个tensorboard-test.py 代码如下 # tensorboard-test.py from tensorboardX import SummaryWriter# 创建一个"my-log"的tensorboard日志…

Vue10-实战快速上手

实战快速上手 我们采用实战教学模式并结合ElementUI组件库&#xff0c;将所需知识点应用到实际中&#xff0c;以最快速度带领大家掌握Vue的使用&#xff1b; 1、创建工程 注意&#xff1a;命令行都要使用管理员模式运行 1、创建一个名为hello-vue的工程vue init webpack hel…