
LeetCode-Go 题解 58Length of Last Word 从后向前扫描的 Go 实现与源码解析【免费下载链接】LeetCode-Go✅ Solutions to LeetCode by Go, 100% test coverage, runtime beats 100% | LeetCode 题解项目地址: https://gitcode.com/GitHub_Trending/le/LeetCode-Go导读本文讲解 LeetCode 第 58 题「最后一个单词的长度」Length of Last Word在 LeetCode-Go 仓库中的标准解法从字符串尾部向前扫描先跳过末尾空格定位单词结尾再向前找到单词开头两次位置相减即得单词长度。读完本文你将掌握该题目的完整题意、O(n) 时间 O(1) 空间的 Go 实现、测试用例的验证方式以及仓库内对应的源码与测试文件组织。题目描述给定一个字符串s它由若干单词组成单词之间以任意数量的空格 分隔且字符串首尾也可能存在空格。要求返回字符串中最后一个单词的长度。这里的单词定义为仅由非空格字符组成的最长子字符串。示例示例 1Input: s Hello World Output: 5 Explanation: The last word is World with length 5.示例 2Input: s fly me to the moon Output: 4 Explanation: The last word is moon with length 4.示例 3Input: s luffy is still joyboy Output: 6 Explanation: The last word is joyboy with length 6.约束条件1 s.length 10^4s仅由英文字母和空格 组成s中至少包含一个单词解题思路题目最直观的解法是先按空格切分字符串取最后一个非空片段但这样做需要额外的切片开销。仓库给出的解法采用从后向前双指针扫描策略不需要任何额外空间用指针last从字符串末尾出发先跳过所有尾部空格此时last指向最后一个单词的最后一个字符用指针first从last处继续向前遍历直到遇到空格或越界此时first指向最后一个单词的前一个位置即单词开头的左边界二者位置相减last - first即为最后一个单词的长度。该思路的关键洞察是题目只要求最后一个单词的长度因此无需处理整个字符串从尾部反向扫描即可在碰到第一个单词边界时立刻收工。源码实现解析仓库中的核心实现在 leetcode/0058.Length-of-Last-Word/58.Length of Last Word.go完整代码如下package leetcode func lengthOfLastWord(s string) int { last : len(s) - 1 for last 0 s[last] { last-- } if last 0 { return 0 } first : last for first 0 s[first] ! { first-- } return last - first }逐段分析last : len(s) - 1从字符串最末一个字符开始s[last]为字节数组索引访问Go 中字符串可按下标直接读取单个字节第一个for循环s[last] 时持续左移将last收敛到最后一个单词的末尾字符下标。示例 2 中 fly me to the moon 末尾有两个空格循环会跳过它们使last指向nif last 0 { return 0 }防御性分支。若整个字符串全部由空格构成题目约束保证至少有一个单词但该分支让函数对非法的全空格输入也保持健壮直接返回 0第二个for循环从last起向前只要s[first] ! 就继续左移直到first指向单词左侧的空格或下标 -1return last - first例如Hello Worldlast停在d下标 10first停在 下标 510 - 5 5即World的长度。若单词就是整个字符串的首词first会一路减到 -1last - (-1) last 1恰好等于单词长度边界正确。复杂度分析时间复杂度O(n)最坏情况下两个循环各自至多扫描一次字符串均为单次线性遍历总体不超过 2n 次比较其中 n 为字符串长度空间复杂度O(1)仅使用两个整型指针不依赖任何额外数据结构。测试用例验证仓库为本题编写了完整的表驱动测试见 leetcode/0058.Length-of-Last-Word/58.Length of Last Word_test.go。测试采用question58 / para58 / ans58三组结构体组织输入与期望输出qs : []question58{ {para58{Hello World}, ans58{5}}, {para58{ fly me to the moon }, ans58{4}}, {para58{luffy is still joyboy}, ans58{6}}, {para58{ }, ans58{0}}, }测试覆盖了题目给出的三个官方示例并额外补充了一个边界用例全空格字符串 期望返回 0用于验证源码中的if last 0防御分支确实生效。这正是仓库「100% test coverage」风格的体现——除官方样例外还会针对边界条件补测。运行测试与覆盖率统计可参考仓库根目录的 gotest.sh其使用 Go 1.10 的多包一次性覆盖率写法go test -covermodeatomic -coverprofilecoverage.txt ./leetcode/...单独运行本题测试可执行go test ./leetcode/0058.Length-of-Last-Word/ -v测试通过时会输出PASS及每轮【input】/【output】的打印结果任一输入未命中期望值会通过t.Fatalf直接失败。进阶与其他写法的对比从源码结构看本解法刻意避开了标准库的字符串工具函数以获得最优常数。这里对比两种常见替代写法帮助理解为何仓库选择手写循环strings.TrimRight 逆向计数先用strings.TrimRight(s, )去掉尾部空格再从尾部数到第一个空格为止。代码更短但多一次整串拷贝/扫描的开销strings.Fields切分words : strings.Fields(s); return len(words[len(words)-1])语义最直白但会为整个字符串分配切片与子串空间复杂度退化为 O(n)且Fields需要扫描全串。当输入规模达到约束上限10^4时上述差异虽不显著但手写双指针方案在时间与空间上都做到最优与仓库「runtime beats 100%」的整体目标一致。需要说明的是LeetCode 的实际运行数据随平台与语言版本波动此处仅从算法复杂度层面进行比较。仓库文件导航题解文档英文website/content.en/ChapterFour/0001~0099/0058.Length-of-Last-Word.md题解文档中文website/content/ChapterFour/0001~0099/0058.Length-of-Last-Word.md解题目录含源码、测试、说明leetcode/0058.Length-of-Last-Word/仓库覆盖率的统一执行脚本gotest.sh小结Length of Last Word 是一道经典的字符串入门题核心考点在于对空格边界的处理。LeetCode-Go 仓库给出的解法用「先跳尾空格、再找词头」的两段式逆向扫描在 O(n) 时间内、O(1) 空间内完成计算并通过表驱动测试覆盖了官方示例与全空格边界场景。掌握这一「从尾部定位区间」的模式后处理「最后一个」「末尾段」类的字符串问题都能触类旁通。【免费下载链接】LeetCode-Go✅ Solutions to LeetCode by Go, 100% test coverage, runtime beats 100% | LeetCode 题解项目地址: https://gitcode.com/GitHub_Trending/le/LeetCode-Go创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考