面试经典150题——最后一个单词的长度
目录
题目链接:58. 最后一个单词的长度 - 力扣(LeetCode)
题目描述
示例
提示:
解法一:反向遍历
Java写法:
C++写法:
解法二:逆天解法
思路
存在的问题
总结
题目链接:58. 最后一个单词的长度 - 力扣(LeetCode)
注:下述题目描述和示例均来自力扣
题目描述
给你一个字符串 s,由若干单词组成,单词前后用一些空格字符隔开。返回字符串中 最后一个 单词的长度。
单词 是指仅由字母组成、不包含任何空格字符的最大子字符串。
示例
示例 1:
输入:s = "Hello World" 输出:5 解释:最后一个单词是“World”,长度为 5。
示例 2:
输入:s = " fly me to the moon " 输出:4 解释:最后一个单词是“moon”,长度为 4。
示例 3:
输入:s = "luffy is still joyboy" 输出:6 解释:最后一个单词是长度为 6 的“joyboy”。
提示:
1 <= s.length <= 10^4s仅有英文字母和空格' '组成s中至少存在一个单词

解法一:反向遍历
- 去除尾部的空格:
- 使用
std::string的find_last_not_of方法找到最后一个不是空格的字符的索引。 - 然后使用
erase方法从该索引的下一个位置开始删除,直到字符串末尾,这样就去除了尾部的所有空格。
- 使用
- 检查字符串是否为空:
- 调用
empty方法来检查处理后的字符串是否为空。 - 如果为空,说明原字符串只包含空格,没有实际的单词,因此返回0。
- 调用
- 查找最后一个空格的位置:
- 使用
find_last_of方法在字符串中查找最后一个空格的索引。 - 如果找不到空格(即返回
std::string::npos),说明整个字符串就是一个单词,或者整个字符串为空(但已经在第2步中处理过了)。
- 使用
- 计算最后一个单词的长度:
- 如果找到了空格,那么最后一个单词就是空格之后的部分。
- 因此,最后一个单词的长度就是字符串的总长度减去最后一个空格的索引再减1(因为索引是从0开始的,且我们不希望包括空格本身在内)。
- 如果没有找到空格,说明整个字符串就是一个单词,直接返回字符串的长度即可。
这个思路的关键在于先对字符串进行预处理(去除尾部空格),然后利用字符串的查找功能来定位最后一个空格的位置,最后根据这个位置来计算最后一个单词的长度。这种方法既简单又高效,能够很好地解决问题。
Java写法:
class Solution {public int lengthOfLastWord(String s) {// 去除字符串尾部的空格 s = s.trim(); // 如果字符串为空,则最后一个单词的长度为0 if (s.length() == 0) { return 0; } // 从字符串末尾开始向前遍历,找到最后一个空格的位置 int length = 0; for (int i = s.length() - 1; i >= 0; i--) { // 如果当前字符不是空格,则增加单词长度 if (s.charAt(i) != ' ') { length++; } // 如果当前字符是空格,且已经计算过单词长度(即length不为0),则跳出循环 else if (length > 0) { break; } } return length; }
}

C++写法:
class Solution {
public:int lengthOfLastWord(string s) {// 去除字符串尾部的空格 s.erase(s.find_last_not_of(' ') + 1); // 如果字符串为空,则最后一个单词的长度为0 if (s.empty()) { return 0; } // 从字符串末尾开始向前遍历,找到最后一个空格的位置 size_t lastSpaceIndex = s.find_last_of(' '); if (lastSpaceIndex == std::string::npos) { // 如果没有找到空格,说明整个字符串就是一个单词 return s.length(); } else { // 返回最后一个单词的长度 return s.length() - lastSpaceIndex - 1; } }
};

解法二:逆天解法
这题还是很简单的嘛,但是我看见逆天网有的逆天代码了额如下
class Solution {public int lengthOfLastWord(String s) {return s.trim().length()-s.trim().lastIndexOf(" ")-1;}
}
思路
- 去除首尾空格:使用
trim()方法去除字符串s首尾的所有空格字符。 - 计算总长度:使用
trim()方法后的字符串的length()方法来获取去除空格后的字符串长度。 - 查找最后一个空格的位置:再次使用
trim()方法(注意这里实际上是多余的,因为trim()已经在前一步调用过了,但在这个表达式中它会再次执行)后的字符串的lastIndexOf(" ")方法来查找最后一个空格的索引。 - 计算单词长度:通过总长度减去最后一个空格的索引(需要再减1,因为索引是从0开始的,并且我们不想包括空格在内)来尝试获取最后一个单词的长度。
存在的问题
-
多余的
trim()调用:在表达式中,s.trim()被调用了两次,这是不必要的,因为它增加了不必要的计算开销,并且如果trim()方法有副作用(尽管在这个场景中它没有),那么这种用法可能会引入问题。 -
错误处理最后一个单词:如果字符串的最后一个字符不是空格(即整个字符串就是一个单词,或者除了最后一个单词外没有其他空格),那么
lastIndexOf(" ")将返回-1(因为找不到空格)。此时,length() - (-1) - 1会导致错误的计算结果,因为length() - (-1)实际上是字符串的总长度加1,这显然是不正确的。

总结
一个算法的实现方式很多,比如如果你这里使用python来解决的话,会有一些方法可以直接去除长空格,然后你就可以切割字符串了,最后取出最后一个值不就好啦~~
相关文章:
面试经典150题——最后一个单词的长度
目录 题目链接:58. 最后一个单词的长度 - 力扣(LeetCode) 题目描述 示例 提示: 解法一:反向遍历 Java写法: C写法: 解法二:逆天解法 思路 存在的问题 总结 题目链接&…...
【C++】入门基础(上)
Hi,好久不见! 目录 1、C入门小基础 1.1 祖师爷--Bjarne Stroustrup(本贾尼斯特劳斯特卢普) 1.2 C参考文献 1.3 书籍推荐 2、C的第一个程序 3、命名空间 3.1 namespace的价值 3.2 namespace的定义 3.3 命名空间的使…...
Mac中Twig模版安装与SSTI漏洞学习
感谢大佬的文章参考学习。 SSTI:https://www.cnblogs.com/bmjoker/p/13508538.html Homebrew:快速开始 - Homebrew 中文网 Homebrew安装 一键快捷安装:默认使用中科大的源 /bin/bash -c "$(curl -fsSL https://gitee.com/ineo6/homeb…...
【20.5 python中的FastAPI】
python中的FastAPI FastAPI 是一个现代、快速(高性能)的 Web 框架,用于构建 API,基于 Python 3.6 的类型提示。它利用了 Python 3.7 的新特性,如类型提示(Type Hints),来自动生成 A…...
研1日记13
正态分布: toTenor:转数字变为0-1 加载模型: model youmodel() model.load("路径") 测试单个样本:...
Go语言错误处理详解
Go语言以其简洁、高效和并发能力著称。在实际开发中,错误处理是一个不可避免且至关重要的部分。本文将深入探讨Go语言中的错误处理机制,涵盖其原理、使用方法、最佳实践,并提供丰富的代码示例和中文注释。 一、错误处理的基本概念 在Go语言…...
C++基础知识7 list
list 1. list的介绍及使用1.1 list的介绍1.2 list的使用1.2.1 list的构造1.2.2 list iterator的使用1.2.3 list capacity1.2.4 list element access1.2.5 list modifiers1.2.6 list的迭代器失效 2.1 模拟实现list 1. list的介绍及使用 1.1 list的介绍 1.2 list的使用 1.2.1 l…...
Android 车联网——汽车模块介绍(附1)
汽车模块指的是车辆中独立的电子控制单元(ECUs),如发动机控制单元(ECU)、车身控制模块(BCM)等,它们负责特定的功能或系统。 一、控制类模块 这些模块主要用于控制车辆的不同系统,确保车辆各部分的正常运行。 1、ECM ECM(Electronic Control Module,电子控制模块)…...
Windows下SDL2创建最简单的一个窗口
先看运行效果 再上代码: #include <stdio.h> #include "SDL.h"int main(int argc, char* argv[]) {// 初始化SDL视频子系统if (SDL_Init(SDL_INIT_VIDEO) -1){printf("Error: %s\n", SDL_GetError());return -1;} // 创建一个窗口SDL_…...
C++ | Leetcode C++题解之第406题根据身高重建队列
题目: 题解: class Solution { public:vector<vector<int>> reconstructQueue(vector<vector<int>>& people) {sort(people.begin(), people.end(), [](const vector<int>& u, const vector<int>& v) …...
【网络安全】-ssrf服务器请求伪造攻击-burp
SSRF攻击服务器请求伪造攻击 CSRF攻击跨站请求伪造攻击也称客户端请求伪造攻击 两种攻击最主要的区别是一个在服务器,一个在客户端。 文章目录 前言 什么是SSRF攻击? 1.分类: 针对服务器的 SSRF 攻击: 针对后端系统的SSRF攻击: …...
C语言 | Leetcode C语言题解之第405题数字转换为十六进制数
题目: 题解: char * toHex(int num){int i0;char *nums(char*)malloc(sizeof(char)*32);unsigned int newnum(unsigned int)num;if(num0){nums[0]0;nums[1]\0;return nums;}while(newnum>1){int flagnewnum%16;newnum/16;if(flag<9){nums[i]flag0…...
Python快速入门 —— 第一节:基础类型
Python 快速教程说明 适用人群 有其他语言编程基础,或了解过python的群体,至少需要知道变量、对象、函数等基本概念想快速通过python实现一些功能,却不想了解python的底层实现的人群想快速了解python语言框架的人群有兴趣了解python的任何人…...
评价类——熵权法(Entropy Weight Method, EWM),完全客观评价
目录 一、 熵权法赋权代码说明1.1 介绍 二、 手把手教你运行代码2.1 数据示例2.2 可直接运行代码2.3 shangquanfa_eg_Sheet1.csv数据可视化2.4 代码运行过程截屏2.5 代码运行结果截屏2.6 对熵权法的结果分析 三、 提供的代码如何修改?四、 为什么确定极小化指标&…...
Redis——通用命令
目录 Redis通用命令Redis中最核心的两个命令getset Redis全局命令keys语法注意事项 existsdel(delete)expirettlredis的key的过期策略是怎么实现的?了解拓展 type总结 Redis通用命令 Redis的命令非常非常多,所以 1. 掌握常用命令(多操作练习…...
(k8s)kubernetes 挂载 minio csi 的方式(pod挂载pvc存在csi驱动问题,挂载不上)
一、安装Minio(Minio分布式集群搭建部署_minio集群最少几台-CSDN博客) 生成accessKeyID和secretAccessKey: 二、安装csi-s3插件(在k8s集群上) 首先我们把插件的yaml文件都下载下来,为了保证版本测试的一致性,我们下载…...
python tkinter
基本使用 基于tkinter创建 GUI基本四步:窗口->组件->布局->事件 1.创建窗口对象 from tkinter import *root Tk() # 创建窗口root.mainloop() # 进入事件循环 2.创建组件 按钮文本等组件 btn Button(root) # 创建Button组件,使组件在…...
Flink CEP(复杂事件处理)高级进阶
Flink CEP(Complex Event Processing,复杂事件处理)是 Apache Flink 中用于复杂事件模式检测的库。它允许用户定义复杂的事件模式,从流数据中检测出符合模式的事件序列。这在实时监控、欺诈检测、用户行为分析等场景中非常有用。 Flink CEP 高级进阶 为了深入理解和使用 …...
libmodbus:写一个modbusTCP服务
初级代码游戏的专栏介绍与文章目录-CSDN博客 我的github:codetoys,所有代码都将会位于ctfc库中。已经放入库中我会指出在库中的位置。 这些代码大部分以Linux为目标但部分代码是纯C的,可以在任何平台上使用。 源码指引:github源…...
函数模板(初阶)
Hello,大家好,我们大家都知道,C这个编程语言是由C语言继承而来的,因为是继承,所以我们的C就要做出一些区分,要不然的话,就和C语言没有本质上的区别了,我们现在在社会中使用比较多的是…...
HTML 语义化
目录 HTML 语义化HTML5 新特性HTML 语义化的好处语义化标签的使用场景最佳实践 HTML 语义化 HTML5 新特性 标准答案: 语义化标签: <header>:页头<nav>:导航<main>:主要内容<article>&#x…...
论文解读:交大港大上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化学习框架(二)
HoST框架核心实现方法详解 - 论文深度解读(第二部分) 《Learning Humanoid Standing-up Control across Diverse Postures》 系列文章: 论文深度解读 + 算法与代码分析(二) 作者机构: 上海AI Lab, 上海交通大学, 香港大学, 浙江大学, 香港中文大学 论文主题: 人形机器人…...
2024年赣州旅游投资集团社会招聘笔试真
2024年赣州旅游投资集团社会招聘笔试真 题 ( 满 分 1 0 0 分 时 间 1 2 0 分 钟 ) 一、单选题(每题只有一个正确答案,答错、不答或多答均不得分) 1.纪要的特点不包括()。 A.概括重点 B.指导传达 C. 客观纪实 D.有言必录 【答案】: D 2.1864年,()预言了电磁波的存在,并指出…...
C++ 基础特性深度解析
目录 引言 一、命名空间(namespace) C 中的命名空间 与 C 语言的对比 二、缺省参数 C 中的缺省参数 与 C 语言的对比 三、引用(reference) C 中的引用 与 C 语言的对比 四、inline(内联函数…...
Cloudflare 从 Nginx 到 Pingora:性能、效率与安全的全面升级
在互联网的快速发展中,高性能、高效率和高安全性的网络服务成为了各大互联网基础设施提供商的核心追求。Cloudflare 作为全球领先的互联网安全和基础设施公司,近期做出了一个重大技术决策:弃用长期使用的 Nginx,转而采用其内部开发…...
(转)什么是DockerCompose?它有什么作用?
一、什么是DockerCompose? DockerCompose可以基于Compose文件帮我们快速的部署分布式应用,而无需手动一个个创建和运行容器。 Compose文件是一个文本文件,通过指令定义集群中的每个容器如何运行。 DockerCompose就是把DockerFile转换成指令去运行。 …...
【C++从零实现Json-Rpc框架】第六弹 —— 服务端模块划分
一、项目背景回顾 前五弹完成了Json-Rpc协议解析、请求处理、客户端调用等基础模块搭建。 本弹重点聚焦于服务端的模块划分与架构设计,提升代码结构的可维护性与扩展性。 二、服务端模块设计目标 高内聚低耦合:各模块职责清晰,便于独立开发…...
Python ROS2【机器人中间件框架】 简介
销量过万TEEIS德国护膝夏天用薄款 优惠券冠生园 百花蜂蜜428g 挤压瓶纯蜂蜜巨奇严选 鞋子除臭剂360ml 多芬身体磨砂膏280g健70%-75%酒精消毒棉片湿巾1418cm 80片/袋3袋大包清洁食品用消毒 优惠券AIMORNY52朵红玫瑰永生香皂花同城配送非鲜花七夕情人节生日礼物送女友 热卖妙洁棉…...
高效线程安全的单例模式:Python 中的懒加载与自定义初始化参数
高效线程安全的单例模式:Python 中的懒加载与自定义初始化参数 在软件开发中,单例模式(Singleton Pattern)是一种常见的设计模式,确保一个类仅有一个实例,并提供一个全局访问点。在多线程环境下,实现单例模式时需要注意线程安全问题,以防止多个线程同时创建实例,导致…...
动态 Web 开发技术入门篇
一、HTTP 协议核心 1.1 HTTP 基础 协议全称 :HyperText Transfer Protocol(超文本传输协议) 默认端口 :HTTP 使用 80 端口,HTTPS 使用 443 端口。 请求方法 : GET :用于获取资源,…...
