LeetCode第58题_最后一个单词的长度

devtools/2025/3/3 5:24:31/

LeetCode 第58题:最后一个单词的长度

题目描述

给你一个字符串 s,由若干单词组成,单词前后用一些空格字符隔开。返回字符串中最后一个单词的长度。

单词 是指仅由字母组成、不包含任何空格字符的最大子字符串。

难度

简单

题目链接

点击在LeetCode中查看题目

示例

示例 1:

输入:s = "Hello World"
输出:5
解释:最后一个单词是"World",长度为5。

示例 2:

输入:s = "   fly me   to   the moon  "
输出:4
解释:最后一个单词是"moon",长度为4。

示例 3:

输入:s = "luffy is still joyboy"
输出:6
解释:最后一个单词是"joyboy",长度为6。

提示

  • 1 <= s.length <= 10⁴
  • s 仅有英文字母和空格 ' ' 组成
  • s 中至少存在一个单词

解题思路

方法一:从后向前遍历

这道题的关键是要处理好字符串末尾的空格和单词的边界。从后向前遍历是一个很好的选择。

关键点:

  1. 从字符串末尾开始遍历,跳过末尾的空格
  2. 统计连续的非空格字符数量
  3. 遇到空格或到达字符串开头时停止

具体步骤:

  1. 初始化单词长度为0
  2. 从字符串末尾开始向前遍历,跳过末尾的空格
  3. 继续向前遍历,统计连续的非空格字符,直到遇到空格或到达字符串开头
  4. 返回统计的字符数量

时间复杂度:O(n),其中n是字符串的长度
空间复杂度:O(1),只需要常数级别的额外空间

方法二:分割字符串

另一种思路是使用字符串分割函数,但这种方法的空间复杂度较高。

具体步骤:

  1. 使用字符串分割函数将字符串按空格分割成数组
  2. 过滤掉空字符串
  3. 返回最后一个单词的长度

时间复杂度:O(n)
空间复杂度:O(n),需要存储分割后的字符串数组

代码实现

C# 实现(从后向前遍历)

public class Solution {public int LengthOfLastWord(string s) {int length = 0;int i = s.Length - 1;// 跳过末尾的空格while (i >= 0 && s[i] == ' ') {i--;}// 统计最后一个单词的长度while (i >= 0 && s[i] != ' ') {length++;i--;}return length;}
}

C# 实现(分割字符串)

public class Solution {public int LengthOfLastWord(string s) {string[] words = s.Split(' ', StringSplitOptions.RemoveEmptyEntries);return words[words.Length - 1].Length;}
}

执行结果

方法一(从后向前遍历):

  • 执行用时:52 ms
  • 内存消耗:36.7 MB

方法二(分割字符串):

  • 执行用时:64 ms
  • 内存消耗:37.1 MB

代码亮点

  1. 🎯 从后向前遍历的方法避免了额外的空间开销
  2. 💡 跳过末尾空格的处理很巧妙
  3. 🔍 边界条件处理完善
  4. 🎨 代码结构清晰,易于理解

常见错误分析

  1. 🚫 没有处理字符串末尾的空格
  2. 🚫 没有处理字符串全是空格的情况
  3. 🚫 使用Split方法时没有正确处理空字符串
  4. 🚫 遍历时的边界条件判断错误

解法对比

解法时间复杂度空间复杂度优点缺点
从后向前遍历O(n)O(1)空间效率高,实现简单需要仔细处理边界条件
分割字符串O(n)O(n)代码简洁,易于理解空间开销较大

相关题目

  • LeetCode 151. 反转字符串中的单词 - 中等
  • LeetCode 557. 反转字符串中的单词 III - 简单
  • LeetCode 434. 字符串中的单词数 - 简单

http://www.ppmy.cn/devtools/164101.html

相关文章

Spring DIIoC

一.IoC 1.简介 什么是IoC&#xff1f;IoC&#xff0c;全称 Inversion of Control&#xff0c;控制反转。IoC是Spring的核心思想&#xff0c;Spring是⼀个“控制反转”的容器。 如果我们需要一个对象&#xff0c;正常来说我们是通过new一个对象&#xff0c;这个时候我们依赖的…

OptiTrack光学跟踪系统:引领工厂机器人应用的革新浪潮

在现代化的工厂生产线上&#xff0c;一台机械臂正以惊人的毫米级精度执行着精密零件的装配任务。这一精准操作的背后&#xff0c;是OptiTrack光学跟踪系统的实时捕捉与优化&#xff0c;它正助力生产效率与产品质量迈向新的高度。如今&#xff0c;这一技术正在全球范围内广泛应用…

【异地访问本地DeepSeek】Flask+内网穿透,轻松实现本地DeepSeek的远程访问

写在前面&#xff1a;本博客仅作记录学习之用&#xff0c;部分图片来自网络&#xff0c;如需引用请注明出处&#xff0c;同时如有侵犯您的权益&#xff0c;请联系删除&#xff01; 文章目录 前言依赖Flask构建本地网页访问LM Studio 开启网址访问DeepSeek 调用模板Flask 访问本…

Spark技术系列(二):深入理解RDD编程模型——从原理到生产实践

Spark技术系列(二):深入理解RDD编程模型——从原理到生产实践 1. RDD设计哲学与核心定位 1.1 为什么需要RDD? MapReduce的缺陷:固定Map/Reduce阶段、中间数据频繁落盘、难以处理迭代计算RDD(Resilient Distributed Datasets)核心价值: 内存计算:中间结果缓存至内存,…

游戏引擎学习第125天

仓库:https://gitee.com/mrxiao_com/2d_game_3 回顾并为今天的内容做准备。 昨天&#xff0c;当我们离开时&#xff0c;工作队列已经完成了基本的功能。这个队列虽然简单&#xff0c;但它能够执行任务&#xff0c;并且我们已经为各种操作编写了测试。字符串也能够正常推送到队…

DeepSeep开源周,第三天:DeepGEMM是啥?

Deep GEMM 是 Deepseek 开源的一个高性能矩阵乘法优化库&#xff0c;专为深度学习场景设计。矩阵乘法&#xff08;GEMM&#xff09;是深度学习模型的核心运算&#xff08;如全连接层、卷积层等&#xff09;&#xff0c;其性能直接影响训练和推理效率。Deep GEMM 通过算法优化、…

Linux下的网络通信编程

在不同主机之间&#xff0c;进行进程间的通信。 1解决主机之间硬件的互通 2.解决主机之间软件的互通. 3.IP地址&#xff1a;来区分不同的主机&#xff08;软件地址&#xff09; 4.MAC地址&#xff1a;硬件地址 5.端口号&#xff1a;区分同一主机上的不同应用进程 网络协议…

Storm实时流式计算系统(全解)——中

storm编程的基本概念-topo-spout-bolt 例如下&#xff1a; storm 编程接口-spout的结构及组件实现 storm编程案例-spout组件-实现 这是我的第一个组件&#xff08;spout组件继承BaseRichSput&#xff09;所有重写内部的三个方法&#xff0c;用于接收数据&#xff08;这里数据是…