1. 151.翻转字符串里的单词建议这道题目基本把 刚刚做过的字符串操作 都覆盖了不过就算知道解题思路本题代码并不容易写要多练一练。 题目链接https://leetcode.cn/problems/reverse-words-in-a-string/ 视频讲解https://www.bilibili.com/video/BV1uT41177fX2.解题思路先处理空格再整体反转最后单词反转原地修改空间复杂度O(1)核心分为三步(1)移除多余空格去除字符串前导、尾随空格并将单词间的多个连续空格合并为单个空格。(2)反转整个字符串将整个字符串 s 完全反转此时单词顺序会整体颠倒但每个单词内部的字母也是反转的。(3)反转每个单词遍历字符串以空格为界反转每个单词恢复单词内部字母的顺序。3.遇到的问题(1)整体反转后单词内部顺序错误- 错误只反转了整个字符串忘记再反转每个单词导致每个单词的字母也是倒序的比如 the sky 变成 yks eht 而不是 sky the 。- 解决整体反转后必须以空格为界逐个反转单词内部的字符。(2)reverse 区间理解错误- 错误反转单词时区间写错比如把结束位置写成 i 而不是 i1 导致单词最后一个字符没被反转。- 解决记住 std::reverse 是左闭右开区间 [first, last) 结束位置要写 s.begin() i 当 i 是空格位置时刚好包含整个单词(3)边界条件遗漏- 比如输入全是空格 、单个单词 hello 、多个连续空格 a b c 如果不处理会导致越界或结果异常。- 解决测试时覆盖这些边界用例尤其是空字符串、只有一个单词的情况。4.class Solution {public:string reverseWords(string s) {removeExtraSpaces(s);reverse(s.begin(), s.end());int start 0;for (int i 0; i s.size(); i) {if (i s.size() || s[i] ) {reverse(s.begin() start, s.begin() i);start i 1;}}return s;}private:void removeExtraSpaces(string s) {int slow 0, fast 0;int n s.size();while (fast n s[fast] ) fast;while (fast n) {if (fast 0 s[fast] s[fast-1] ) {fast;continue;}s[slow] s[fast];}if (slow 0 s[slow-1] ) slow--;s.resize(slow);}};5.收获(1)边界思维的重要性处理字符串问题时一定要考虑空字符串、全空格、单个单词、多个连续空格等特殊情况避免代码只通过示例用例却在边界条件上翻车。(2)原地处理字符串问题时 移除多余空格 → 整体反转 → 局部反转 是非常通用的思路能高效解决单词反转类问题且空间复杂度为 O(1)。