题目描述
思路解析动画文字版
记住这句口诀:每个单词左右各放一个指针,往中间夹着两两交换,空格不动、顺序不变。下面每帧都在套它。
先把句子摊成一排字符格子。灰色的两格是空格,它们把句子切成三个单词 Let、us、code。空格永远不动,我们只在每个单词内部做交换。
扫到第 1 个单词的开头,左指针 l 落在下标 0,也就是字符 「L」。接着要找这个单词的右端在哪。
右指针 r 一路向右滑,碰到空格或句尾就停,停在下标 2(字符 「t」)。这样单词 「Let」 的左右两端 l=0、r=2 都框定了。
现在 l=0 在 r=2 的左边,符合「l 在 r 左边就交换」的条件。把这两格的字母 「L」 和 「t」 对调一下。
交换好了,下标 0 变成 「t」,下标 2 变成 「L」。然后 l 向右走一步、r 向左走一步,继续往中间夹。
两个指针碰头了,停在同一格 1。中间这个字符 「e」 跟自己交换没意义,所以单词长度是奇数时,正中间那一格保持不动。
这个单词反转完成,标成绿色,结果是 「teL」。注意它还在原来的位置上,空格也没挪,整句的单词顺序丝毫没变。
扫到第 2 个单词的开头,左指针 l 落在下标 4,也就是字符 「u」。接着要找这个单词的右端在哪。
右指针 r 一路向右滑,碰到空格或句尾就停,停在下标 5(字符 「s」)。这样单词 「us」 的左右两端 l=4、r=5 都框定了。
现在 l=4 在 r=5 的左边,符合「l 在 r 左边就交换」的条件。把这两格的字母 「u」 和 「s」 对调一下。
交换好了,下标 4 变成 「s」,下标 5 变成 「u」。然后 l 向右走一步、r 向左走一步,继续往中间夹。
l 已经走到 r 的右边,「l 在 r 左边」这个条件不成立了,交换就此打住。单词长度是偶数时,正好两两配对、没有落单的字符。
这个单词反转完成,标成绿色,结果是 「su」。注意它还在原来的位置上,空格也没挪,整句的单词顺序丝毫没变。
扫到第 3 个单词的开头,左指针 l 落在下标 7,也就是字符 「c」。接着要找这个单词的右端在哪。
右指针 r 一路向右滑,碰到空格或句尾就停,停在下标 10(字符 「e」)。这样单词 「code」 的左右两端 l=7、r=10 都框定了。
现在 l=7 在 r=10 的左边,符合「l 在 r 左边就交换」的条件。把这两格的字母 「c」 和 「e」 对调一下。
交换好了,下标 7 变成 「e」,下标 10 变成 「c」。然后 l 向右走一步、r 向左走一步,继续往中间夹。
现在 l=8 在 r=9 的左边,符合「l 在 r 左边就交换」的条件。把这两格的字母 「o」 和 「d」 对调一下。
交换好了,下标 8 变成 「d」,下标 9 变成 「o」。然后 l 向右走一步、r 向左走一步,继续往中间夹。
l 已经走到 r 的右边,「l 在 r 左边」这个条件不成立了,交换就此打住。单词长度是偶数时,正好两两配对、没有落单的字符。
这个单词反转完成,标成绿色,结果是 「edoc」。注意它还在原来的位置上,空格也没挪,整句的单词顺序丝毫没变。
三个单词全部反转好了,拼起来正是 teL su edoc。每个单词内部倒过来,空格和单词的先后顺序原样保留,和一开始算出的目标一模一样。
边界先想清:整句一个词、偶数长度、单字符。
面试重点:和 151 区分开,再答出原地与切分两种写法。
参考代码
from __future__ import annotationsfrom typing import *from collections import *from functools import *from itertools import *from math import *from heapq import *from bisect import *class Solution: def reverseWords(self, s: str) -> str: return " ".join(t[::-1] for t in s.split())复杂度
- 时间:O(n),每个字符最多被指针看一次、交换一次
- 空间:O(1),原地双指针,只用 l、r 两个下标;参考代码按切分拼接记 O(n)
易错点
面试追问把动画讲成自己的话
追问这题和「反转字符串里的单词」(LeetCode 151) 有什么区别?
追问能不能一行解决?
这道题到这就讲完了。动画和文字是同一套思路——别光看,关掉页面自己默写一遍。然后顺着主线继续:
最长连续递增序列
LeetCode 674 · 简单 · 沿着 双指针套路 继续往下推进
把这道题真正学会,再走
图解算法年卡 ¥99 /年
- ✓本题每步动画的吴师兄语音讲解(全站陆续覆盖)
- ✓小欧带 8 步通关训练——追问到不看答案也能写对、能 30 秒讲给面试官听
- ✓学习报告,记录每道题的掌握程度
76k+ GitHub Star · 吴师兄开源图解算法,几十万开发者在看的算法讲解
想成体系刷透这类套路?去图解算法专题