网站站内搜索体验12项硬性评估指标与优化实战
2026/7/6 10:20:54
给定一个字符串s,你需要反转字符串中每个单词的字符顺序,同时仍保留空格和单词的初始顺序。
示例 1:
输入:s = "Let's take LeetCode contest"输出:"s'teL ekat edoCteeL tsetnoc"
示例 2:
输入:s = "Mr Ding"输出:"rM gniD"s思路:
利用双指针先将字符串转化为List,因为字符串不可反转,然后把字符串反转,然后再根据每个单词间利用空格隔开之后再把单词位置进行反转即可。
class Solution: def reserveWords(self,s:str)->str: def reserveWords(word): a,b=0,len(word)-1 word=list(word) while a<b: word[a],word[b]=word[b],word[a] a+=1 b-=1 return "".join(word) return " ".join(reserveWords(i)for i in s.split())难点:
reservewords(单词字符反转)的实现难点word=list(word)),交换后再通过''.join(word)转回字符串 —— 这是处理字符串原地修改的关键技巧,也是新手容易踩坑的点(若直接操作字符串会报错)。s.split()会自动忽略首尾空格和多个连续空格,仅按「单个空格」分割成单词列表(例如" hello world "分割后是["hello", "world"])。若误用s.split(' '),则会保留空字符串(如上述例子分割后是["", "", "hello", "", "", "world", "", ""]),导致后续反转空字符串、拼接出多余空格 —— 这是字符串分割的高频易错点。reservewords(i) for i in s.split()是生成器表达式,而非列表推导式。它无需先构建完整列表,而是边遍历边反转,节省内存(尤其处理长字符串时)。新手可能会写成[reservewords(i) for i in s.split()],虽然结果正确,但内存效率稍低,理解生成器与列表的区别是进阶难点。"abc def"得到"fed cba",再分割反转每个单词),或直接反转单词列表(得到"def abc"),核心是精准理解「反转范围」。' '.join(...)会在单词间仅拼接一个空格,天然规避了原字符串中多余空格的问题。若手动遍历拼接(如循环加空格),容易出现首尾空格或多空格,join方法的正确使用是简化逻辑的关键。