当前位置: 首页 > article >正文

面试经典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^4
  • s 仅有英文字母和空格 ' ' 组成
  • s 中至少存在一个单词

21f0915dd4fe49fdb336684e060ba55b.jpeg


解法一:反向遍历

  1. 去除尾部的空格
    • 使用std::stringfind_last_not_of方法找到最后一个不是空格的字符的索引。
    • 然后使用erase方法从该索引的下一个位置开始删除,直到字符串末尾,这样就去除了尾部的所有空格。
  2. 检查字符串是否为空
    • 调用empty方法来检查处理后的字符串是否为空。
    • 如果为空,说明原字符串只包含空格,没有实际的单词,因此返回0。
  3. 查找最后一个空格的位置
    • 使用find_last_of方法在字符串中查找最后一个空格的索引。
    • 如果找不到空格(即返回std::string::npos),说明整个字符串就是一个单词,或者整个字符串为空(但已经在第2步中处理过了)。
  4. 计算最后一个单词的长度
    • 如果找到了空格,那么最后一个单词就是空格之后的部分。
    • 因此,最后一个单词的长度就是字符串的总长度减去最后一个空格的索引再减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;  
    }  
}

ac299b9346d54333932be6d816c07ca9.png

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;  
        }  
    }  
};  

161ba69bcb40495b9f2af9ebeb9c0623.png

 


解法二:逆天解法

这题还是很简单的嘛,但是我看见逆天网有的逆天代码了额如下
 

class Solution {
    public int lengthOfLastWord(String s) {
        return s.trim().length()-s.trim().lastIndexOf(" ")-1;
    }
}

思路 

  1. 去除首尾空格:使用 trim() 方法去除字符串 s 首尾的所有空格字符。
  2. 计算总长度:使用 trim() 方法后的字符串的 length() 方法来获取去除空格后的字符串长度。
  3. 查找最后一个空格的位置:再次使用 trim() 方法(注意这里实际上是多余的,因为 trim() 已经在前一步调用过了,但在这个表达式中它会再次执行)后的字符串的 lastIndexOf(" ") 方法来查找最后一个空格的索引。
  4. 计算单词长度:通过总长度减去最后一个空格的索引(需要再减1,因为索引是从0开始的,并且我们不想包括空格在内)来尝试获取最后一个单词的长度。

存在的问题

  • 多余的 trim() 调用:在表达式中,s.trim() 被调用了两次,这是不必要的,因为它增加了不必要的计算开销,并且如果 trim() 方法有副作用(尽管在这个场景中它没有),那么这种用法可能会引入问题。

  • 错误处理最后一个单词:如果字符串的最后一个字符不是空格(即整个字符串就是一个单词,或者除了最后一个单词外没有其他空格),那么 lastIndexOf(" ") 将返回 -1(因为找不到空格)。此时,length() - (-1) - 1 会导致错误的计算结果,因为 length() - (-1) 实际上是字符串的总长度加1,这显然是不正确的。

043408471c0b4706a5eb041e925bbd8c.jpeg



总结

        一个算法的实现方式很多,比如如果你这里使用python来解决的话,会有一些方法可以直接去除长空格,然后你就可以切割字符串了,最后取出最后一个值不就好啦~~

 


http://www.kler.cn/news/308266.html

相关文章:

  • 基于双向RRT算法的三维空间最优路线规划matlab仿真
  • 云服务器开放端口
  • 短信验证码倒计时 (直接复制即可使用) vue3
  • 今日leetCode 242.有效的字母异位词
  • 【二叉树进阶】二叉搜索树
  • 视频格式转为mp4(使用ffmpeg)
  • 小程序面试题八
  • 【百日算法计划】:每日一题,见证成长(014)
  • 【SQL Server】清除日志文件ERRORLOG、tempdb.mdf
  • 如何快准稳 实现MySQL大表历史数据迁移?
  • linux文件系统权限详解
  • 服务器——装新的CUDA版本的方法
  • Web:HTTP包的相关操作
  • RocksDB系列一:基本概念
  • flink实战--如何基于java-agent技术增强Flink功能
  • 【Hot100】LeetCode—4. 寻找两个正序数组的中位数
  • 简单易懂的变动率指标ROC,做短线的快来了解一下
  • 超链接/表格/表单的复习(课后作业)
  • 蓝桥杯DS18B20程序源码
  • 【数据结构】4——树和森林
  • Mastering openFrameworks_第十一章_网络
  • 身份识别与服装类型检测系统源码分享
  • 基于微信小程序图书馆自习室座位预约小程序
  • USB组合设备——串口+鼠标+键盘
  • WPS生成目录
  • OpengGL教程(六)---坐标的变换和坐标系的变换
  • 文献多\bibliographystyle和文献少\begin{thebibliography}
  • 【JAVA】数据脱敏技术(对称加密算法、非对称加密算法、哈希算法、消息认证码(MAC)算法、密钥交换算法)使用方法
  • JUC学习笔记(二)
  • sed编辑器与awk的用法