思路
题目要求:反转字符串中单词的顺序,同时去除多余空格(首尾空格、单词间多个空格)。
核心技巧:整体反转 + 局部反转
- 去掉首尾空格,将中间连续空格压缩为单个空格
- 整体反转整个字符串
- 再逐个反转每个单词
例:
““the sky is blue””
去空格 →
““the sky is blue””
整体反转 →
““eulb si yks eht””
逐词反转 →
““blue is sky the”” ✅
这种方法只需 O(n) 时间、O(n) 空间(Python 字符串不可变,需用数组)。
代码实现
class Solution:
def reverseWords(self, s: str) -> str:
# 1. 清洗:去首尾空格,压缩中间空格
s = s.strip()
chars = list(s)
# 2. 整体反转 self.reverse(chars, 0, len(chars) - 1) # 3. 逐个反转每个单词 left = 0 for i in range(len(chars) + 1): # 遇到空格或到达末尾,说明一个单词结束 if i == len(chars) or chars[i] == ' ': self.reverse(chars, left, i - 1) left = i + 1 return ''.join(chars) def reverse(self, chars, l, r): """反转 chars[l:r+1]""" while l < r: chars[l], chars[r] = chars[r], chars[l] l += 1 r -= 1更 Pythonic 的解法(面试也常用)
class Solution:
def reverseWords(self, s: str) -> str:
return ’ '.join(s.split()[::-1])
“s.split()”:自动按空白分割并丢弃空字符串,天然处理多余空格
“[::-1]”:切片反转列表
“’ '.join(…)”:用单空格拼回字符串
复杂度对比
解法 时间 空间 特点
双反转(原地思想) O(n) O(n) 考察指针与反转技巧,面试加分
“split()[::-1]” O(n) O(n) 代码简洁,实际工程首选
关键易错点
- 不要直接用
“chars.reverse()”,要自己写双指针,体现对过程的理解 - 单词边界判断要用
“i == len(chars) or chars[i] == ’ '”,漏掉末尾会导致最后一个单词不反转 - Python 中
“str” 不可变,必须转
“list” 再操作,最后
“‘’.join()”
推荐:面试时先写出
“split()[::-1]” 展示思路清晰,再补上双反转版本体现底层能力。