每日一题——Python代码实现力扣58. 最后一个单词的长度(举一反三+思想解读+逐步优化)五千字好文


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

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

Python-3.12.0文档解读

目录

我的写法 

代码逻辑:

时间复杂度:

空间复杂度:

代码优化:

我要更强

代码解释:

时间复杂度分析:

空间复杂度分析:

哲学和编程思想

1. 简洁性和直接性(Simplicity and Directness)

2. 空间利用效率(Space Efficiency)

3. 时间效率(Time Efficiency)

4. 算法的高效性(Algorithmic Efficiency)

5. Robustness

6. 减少外部依赖(Reduced Dependency on External Functions)

具体说明优化方法的哲学和编程思想:

总结

举一反三

1. 简洁性和直接性

2. 空间利用效率

3. 时间效率

4. 算法的高效性

5. 代码的鲁棒性

6. 减少外部依赖


题目链接

我的写法 

class Solution:def lengthOfLastWord(self, s: str) -> int:s=s.split()return len(s[-1])

这段代码定义了一个名为 Solution 的类,其中包含一个方法 lengthOfLastWord,该方法接收一个字符串 s 作为输入,并返回该字符串中最后一个单词的长度。下面是对这段代码的专业点评:

  1. 代码逻辑:

    • 首先,使用 split() 方法将输入的字符串 s 分割成单词列表。split() 方法默认以空格作为分隔符,将字符串分割成多个子字符串,并返回这些子字符串组成的列表。
    • 然后,通过索引 [-1] 获取列表中的最后一个元素,即最后一个单词。
    • 最后,使用 len() 函数计算并返回这个单词的长度。
  2. 时间复杂度:

    • split() 方法的时间复杂度为 O(n),其中 n 是字符串 s 的长度。这是因为 split() 需要遍历整个字符串来分割单词。
    • len() 函数的时间复杂度为 O(1),因为它只需要返回列表中元素的数量。
    • 因此,整体的时间复杂度主要由 split() 决定,为 O(n)。
  3. 空间复杂度:

    • split() 方法会创建一个新的列表,其大小取决于字符串中单词的数量。在最坏的情况下,如果字符串中的每个字符都是单词的一部分(即没有空格),则列表的大小为 n。
    • 因此,空间复杂度为 O(n),其中 n 是字符串 s 的长度。
  4. 代码优化:

  • 这段代码已经相当简洁和高效,但如果要进一步优化,可以考虑直接从字符串的末尾开始遍历,找到最后一个单词的起始位置,然后计算其长度,这样可以避免创建额外的列表,从而减少空间复杂度。

总的来说,这段代码是一个简洁有效的解决方案,适用于大多数情况。如果输入的字符串非常大,可能需要考虑空间效率的优化。


我要更强

当然,我们可以通过直接从字符串末尾开始遍历来优化时间和空间复杂度。这种方法避免了使用 split() 方法创建额外的列表,从而减少了空间复杂度。下面是优化后的代码:

class Solution:def lengthOfLastWord(self, s: str) -> int:# 从字符串末尾开始向前遍历index = len(s) - 1# 跳过末尾的空格while index >= 0 and s[index] == ' ':index -= 1# 计算最后一个单词的长度length = 0while index >= 0 and s[index] != ' ':length += 1index -= 1return length

代码解释:

  • 首先,我们初始化一个变量 index 为字符串 s 的最后一个字符的索引。
  • 然后,我们使用一个循环从末尾向前移动 index,直到找到第一个非空格字符。这跳过了字符串末尾可能存在的空格。
  • 接着,我们使用另一个循环继续向前移动 index,同时计算遇到的非空格字符的数量,即最后一个单词的长度。
  • 最后,返回计算得到的长度。

时间复杂度分析:

  • 在最坏的情况下,我们需要遍历整个字符串,因此时间复杂度为 O(n),其中 n 是字符串的长度。

空间复杂度分析:

  • 我们没有使用任何额外的数据结构(如列表),只使用了几个变量来存储索引和长度,因此空间复杂度为 O(1)。

这种优化方法在处理大型字符串时尤其有效,因为它避免了创建可能非常大的中间列表。


哲学和编程思想

这些方法背后的哲学和编程思想主要包括以下几个方面:

1. 简洁性和直接性(Simplicity and Directness)

优化后的代码直接从字符串末尾开始遍历,避免了不必要的中间步骤。这种方法体现了“简洁即美”的编程哲学。过于复杂的解决方案可能会增加出错的概率和维护成本,而简单直接的方法则更易于理解和维护。

2. 空间利用效率(Space Efficiency)

通过避免创建额外的列表,优化后的代码极大地减少了空间占用,体现了“尽量减少资源使用”的编程思想。这种思维方式在处理大数据时尤为重要,因为内存资源是有限的。

3. 时间效率(Time Efficiency)

优化后的代码通过单次遍历字符串来计算最后一个单词的长度,而不是进行多次遍历或创建中间数据结构,从而提高了时间效率。这符合“尽量减少计算复杂度”的编程哲学。

4. 算法的高效性(Algorithmic Efficiency)

直接从字符串末尾开始遍历的算法是一种“贪心算法”(Greedy Algorithm)的应用,它在每一步选择当前最优解。这种方法保证了在最短的时间内找到最后一个单词的长度。

5. Robustness

无论字符串的情况如何(是否包含多个空格,是否为空字符串等),优化后的方法都能正确处理。这体现了“鲁棒性”的编程思想,即代码能够在各种边界情况下正常运行。

6. 减少外部依赖(Reduced Dependency on External Functions)

优化后的方法减少了对内置函数(如 split())的依赖,使得代码更加自包含和独立。这有助于提高代码的可移植性和灵活性,符合“减少依赖,增加自包含性”的编程原则。

具体说明优化方法的哲学和编程思想:

  • 简洁性和直接性:通过直接从字符串末尾开始遍历,避免了 split() 方法的使用,简化了代码逻辑。
  • 空间利用效率:通过在原字符串上进行操作,而不是创建中间列表,减少了不必要的空间占用。
  • 时间效率:通过单次遍历字符串,减少了不必要的重复遍历,优化了时间复杂度。
  • 算法的高效性:遍历字符串并计算最后一个单词的长度,这种贪心算法在步骤选择上每次都选择最优解。
  • 减少外部依赖:减少对内置函数的依赖,使代码更加独立和灵活。

总结

通过直接处理字符串而不是依赖于 split() 等内置函数,优化后的代码不仅简化了逻辑,提高了时间和空间效率,还遵循了许多重要的编程哲学和思想,如简洁性、效率和减少依赖。这些思想在日常编程中都是非常重要的,可以帮助开发者编写出更高效、可维护性更强的代码。


举一反三

理解和应用这些哲学和编程思想,可以在编程过程中提高代码的质量和效率。以下是一些具体的技巧和建议,帮助你在编写代码时能够举一反三:

1. 简洁性和直接性

技巧:

  • 减少中间步骤:在解决问题时,思考是否可以直接从输入到输出,不经过多余的中间步骤。
  • 避免冗余代码:删除不必要的变量和重复的逻辑,保持代码简洁。
  • 使用简洁的语法:利用Python的简洁语法特性,如列表推导式、生成器等,来减少代码的长度和复杂度。

示例:

# 繁琐的写法
def square_numbers(nums):result = []for num in nums:result.append(num * num)return result# 简洁的写法
def square_numbers(nums):return [num * num for num in nums]

2. 空间利用效率

技巧:

  • 原地操作:如果可以,尽量在原数据结构上进行操作,避免创建新的数据结构。
  • 使用生成器:对于需要惰性求值的情况,使用生成器表达式代替列表推导式,以减少内存占用。
  • 释放不再使用的资源:及时删除或释放不再需要的对象,尤其是在处理大数据时。

示例:

# 使用生成器表达式而不是列表推导式
def large_range():for i in range(10**6):yield i * i# 使用生成器表达式
gen = (i * i for i in range(10**6))

3. 时间效率

技巧:

  • 减少重复计算:避免在循环或递归中进行重复计算,使用缓存或记忆化技术。
  • 优化算法:使用更高效的算法和数据结构,以减少时间复杂度。例如,使用哈希表而不是列表查找。
  • 提前终止条件:在循环或递归中添加提前终止条件,以减少不必要的计算。

示例:

# 使用哈希表进行查找
def find_duplicates(nums):seen = set()for num in nums:if num in seen:return Trueseen.add(num)return False

4. 算法的高效性

技巧:

  • 选择合适的算法:根据具体问题选择合适的算法,如贪心算法、动态规划、二分查找等。
  • 分治思想:将问题分解成更小的子问题,递归求解,然后合并结果。
  • 尽量减少复杂度:在设计算法时,尽量减少时间和空间复杂度。

示例:

# 使用分治思想的归并排序
def merge_sort(arr):if len(arr) <= 1:return arrmid = len(arr) // 2left = merge_sort(arr[:mid])right = merge_sort(arr[mid:])return merge(left, right)def merge(left, right):result = []i = j = 0while i < len(left) and j < len(right):if left[i] < right[j]:result.append(left[i])i += 1else:result.append(right[j])j += 1result.extend(left[i:])result.extend(right[j:])return result

5. 代码的鲁棒性

技巧:

  • 边界条件处理:在编写代码时,考虑所有可能的边界情况,如空输入、极大值和极小值等。
  • 异常处理:使用适当的异常处理机制,确保代码在异常情况下能够优雅地失败。
  • 单元测试:编写单元测试来验证代码的正确性,特别是针对边界条件和异常情况。

示例:

def safe_divide(a, b):try:return a / bexcept ZeroDivisionError:return float('inf')# 单元测试
assert safe_divide(10, 2) == 5
assert safe_divide(10, 0) == float('inf')

6. 减少外部依赖

技巧:

  • 减少对库的依赖:在可能的情况下,使用标准库或自己实现简单功能,避免引入不必要的第三方库。
  • 模块化设计:将代码划分为独立的模块,使每个模块尽量少依赖其他模块。
  • 自包含性:在编写模块时,确保它们尽量自包含,减少对外部资源的依赖。
# 自己实现简单的功能而不是依赖第三方库
def factorial(n):if n == 0:return 1return n * factorial(n - 1)

通过这些技巧,可以更好地应用简洁性、空间利用效率、时间效率、算法高效性、代码鲁棒性和减少外部依赖等编程哲学和思想,编写出更优雅、高效和可维护的代码。


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

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

相关文章

HTML5休闲小游戏《城堡守卫传说》源码,引流、刷广告利器

HTML5休闲小游戏《城堡守卫传说》源码&#xff0c;直接把源码上传到服务器就能使用了&#xff01; 下载链接&#xff1a;https://www.huzhan.com/code/goods467802.html

成都百洲文化传媒有限公司助力商家扬帆远航

在数字经济的浪潮中&#xff0c;电商行业如日中天&#xff0c;成都百洲文化传媒有限公司正是这一领域的佼佼者。作为一家专注于电商服务的传媒公司&#xff0c;百洲文化以其专业的服务、创新的理念和卓越的成果&#xff0c;在业内树立了良好的口碑&#xff0c;成为众多商家信赖…

划分子网和构造超网的学习

子网掩码长度&#xff1d;32位 某位&#xff1d;1&#xff1a;IP地址中的对应位为网络号和子网号 某位&#xff1d;0&#xff1a;IP地址中的对应位为主机号 从一个 IP 数据报的首部并无法判断源主机或目的主机所连接的网络是否进行了子网划分。 使用子网掩码(subnet mask)可…

Python大数据-电商商品详情数据分析【JD电商平台为例】

一、项目背景 网上购物已经成为大众生活的重要组成部分。人们在电商平台上浏览商品并购物&#xff0c;产生了海量的用户行为数据&#xff0c;用户对商品的详情数据对商家具有重要的意义。利用好这些碎片化、非结构化的数据&#xff0c;将有利于企业在电商平台上的持续发展&…

Hbuilder无线连接手机

1.链接数据线进行操作 打开adbs所在位置 2.运行cmd 或者 powershell 3.运行项目

Linux 式套娃,把“文件系统”安装在一个“文件”上?

背景 “文件”在文件系统之中&#xff0c;这是人人理解的概念。但“文件”之上还有一个文件系统&#xff1f;那岂不是成套娃了。但这个其实是可以的。这个就涉及到今天我们要讲的 loop 设备。 很多童鞋在学习 Linux 的文件系统时&#xff0c;涉及到对磁盘设备的格式化&#x…

一个轻量级的TTS模型实现

1.环境 python 版本 3.9 2.训练数据集 本次采用LJSpeech数据集&#xff0c;百度网盘下载地址 链接&#xff1a;https://pan.baidu.com/s/1DDFmPpHQrTR_NvjAfwX-QA 提取码&#xff1a;1234 3.安装依赖 pip install TTS 4.工程结构 5代码部分 decoder.py import torch f…

汇编基础之使用vscode写hello world

汇编语言&#xff08;Assembly Language&#xff09; 概述 汇编语言&#xff08;Assembly Language&#xff09;是一种低级编程语言&#xff0c;它直接对应于计算机的机器代码&#xff08;machine code&#xff09;&#xff0c;但使用了更易读的文本符号。每台个人计算机都有…

iOS 18 Siri 升级之后都有哪些改变?

新界面 首先最显著的改变就是 Siri 的界面不同了&#xff0c;之前的界面是在打开 Siri 之后会出现一个圆形图案&#xff0c;而在 Siri 升级之后变成了屏幕边缘发出亮光。 来源&#xff1a;Apple 可在任意位置使用 苹果的生成式人工智能 Apple Intelligence 将为 Siri 提供支…

注意力机制和Transformer模型各部分功能解释

文章目录 Transformer1、各部分功能解释2、通过例子解释a.输入预处理位置编码b.Encoder 的处理c.Decoder的输入Decoder的工作流程d.输出预测总结 Attention代码和原理理解 Transformer 运行机理&#xff1a; &#xff08;1&#xff09;假设我们需要进行文本生成任务。我们将已…

Springboot集成SSE消息推送

SSE介绍 SSE&#xff08;Server-Sent Events&#xff09;的全称是服务器推送事件&#xff0c;它是一种基于 HTTP 协议的实时通信技术&#xff0c;用于在客户端和服务器之间建立持久、单向的链接&#xff0c;允许服务器向客户端发送异步消息。 了解 websocket 的小伙伴&…

SAP BC 换了logo后,其他人的logo都已经换了,但是其中有一台就是PRD 显示DEV的logo,从smw0上下载的是PRD

昨天终于发现是缓存的问题 GUI登录后 选项-本地数据-缓存 删除本地缓存文件&#xff0c;问题解决了

机器学习课程复习——聚类算法

Q:什么是硬聚类,什么是软聚类? 如果一个样本只能属于一个类,则称为硬聚类(hard clustering); 如果一个样本可以属于多个类,则称为软聚类(soft clustering)。 Q:聚类和分类的区别? 聚类分类学习类型无监督学习方法 不需要事先标记的数据 通过发现数据中的模式或结构来组…

sprintboot依赖管理和自动配置

springboot依赖管理和自动配置 依赖管理和自动配置依赖管理什么是依赖管理修改自动仲裁/默认版本号 starter场景启动器starter场景启动器基本介绍官方提供的starter第三方starter 自动配置自动配置基本介绍SpringBoot自动配置了哪些?如何修改默认配置如何修改默认扫描包结构re…

深入解析 iOS 应用启动过程:main() 函数前的四大步骤

深入解析 iOS 应用启动过程&#xff1a;main() 函数前的四大步骤 背景描述&#xff1a;使用 Objective-C 开发的 iOS 或者 MacOS 应用 在开发 iOS 应用时&#xff0c;我们通常会关注 main() 函数及其之后的执行逻辑&#xff0c;但在 main() 函数之前&#xff0c;系统已经为我们…

C++及cmake语法介绍

c/cmake学习 文章目录 c/cmake学习1. c1.1 基本模型1.1.1 for循环1.1.2 main函数1.1.2 带参数函数编译函数 2. CMAKE2.1 相关命令2.1.1 编译基本命令2.1.2 动态库静态库编译2.1.3 消息输出2.1.4 cmake变量常见参数1. 设置构建类型2. 设置编译器标志3. 指定编译器4. 设置安装路径…

机器学习_PCA

目录 一、概念 二、原理 三、步骤 四、实战 1、数据处理——转rgb为灰度图像 2、手动实现pca降维 3、查看信息保留数量 4、调用第三方库实现pca降维 五、小结 引入&#xff1a; 当说黄河五路和渤海三路交叉口的时候&#xff0c;这些路就类似于我们说的坐标系。而城市中的…

高等数学笔记(三):导数

一、导数概念 1.1 导数的定义 1.1.1 函数在一点处的导数与导函数 1.1.2 单侧导数 1.2 导数的几何意义 1.3 函数可导性与连续性的关系 二、函数的求导法则 2.1 函数的和、差、积、商的求导法则 2.2 反函数的求导法则 2.3 复合函数的求导法则 2.4 基本求导法则与导数公式 三…

必看!!! 2024 最新 PG 硬核干货大盘点(上)

PGConf.dev&#xff08;原名PGCon&#xff0c;从2007年至2023年&#xff09;首次在风景如画的加拿大温哥华市举办。此次重新定位的会议带来了全新的视角和多项新的内容&#xff0c;参会体验再次升级。尽管 PGCon 历来更侧重于开发者&#xff0c;吸引来自世界各地的资深开发者、…

深入理解并打败C语言难关之一————指针(5)(最终篇)

前言&#xff1a; 仔细一想&#xff0c;小编已经把指针的大部分内容都说了一遍了&#xff0c;小编目前有点灵感枯竭了&#xff0c;今天决定就结束指针这一大山&#xff0c;可能很多小编并没有提到过&#xff0c;如果有些没说的小编会在后续博客进行补充道&#xff0c;不多废话了…