算法刷题日记|第十七天:LeetCode 151. 翻转字符串里的单词(字符串综合大练兵)
算法刷题日记第十七天LeetCode 151. 翻转字符串里的单词字符串综合大练兵一、题目回顾给你一个字符串 s 反转字符串中单词的顺序要求- 单词由非空格字符组成用至少一个空格分隔- 结果无首尾空格、单词间仅单个空格- 进阶字符串可变时用 O(1) 额外空间 原地实现示例输入 a good example 输出 example good a二、核心思路原地三步法面试必背这道题把去空格、整体反转、局部反转、双指针全串起来了是字符串操作的综合题。标准原地解法三步搞定1. 去多余空格快慢指针去掉首尾空格、单词间只留一个空格2. 反转整个字符串整体逆序让单词顺序颠倒3. 反转每个单词恢复单词内部正确顺序一句话口诀先去空格 → 整体反转 → 单词再反转三、Python 代码实现方法1简洁写法适合刷题O(n)空间pythondef reverseWords(s: str) - str:# 分割自动去空反转拼接words s.split()return .join(reversed(words))优点一行秒过缺点用了额外空间不满足进阶要求。方法2原地解法面试加分O(1)额外空间pythonclass Solution:def reverseWords(self, s: str) - str:res list(s)n len(res)# 1. 快慢指针去空格slow 0fast 0while fast n:# 找到单词开头while fast n and res[fast] :fast 1# 不是第一个单词先加一个空格if slow ! 0 and fast n:res[slow] slow 1# 复制单词while fast n and res[fast] ! :res[slow] res[fast]slow 1fast 1# 截断到有效长度res res[:slow]# 2. 反转整个字符串def reverse(arr, l, r):while l r:arr[l], arr[r] arr[r], arr[l]l 1r - 1reverse(res, 0, len(res)-1)# 3. 反转每个单词start 0for i in range(len(res)1):if i len(res) or res[i] :reverse(res, start, i-1)start i 1return .join(res)四、关键细节与易错点1. 空格处理是灵魂- 前导、尾随、连续多空格都要清- 单词间只留一个不能多也不能少2. 反转逻辑- 整体反转 → 单词顺序颠倒- 单词内部反转 → 字母顺序恢复3. 边界判断- 到字符串末尾也要处理最后一个单词- 慢指针截断后才是有效字符串