记力扣557.反转字符串中的单词 练习理解

给定一个字符串 s ,你需要反转字符串中每个单词的字符顺序,同时仍保留空格和单词的初始顺序。

示例 1:

复制代码
输入:s = "Let's take LeetCode contest"
输出:"s'teL ekat edoCteeL tsetnoc"

示例 2:

复制代码
输入: s = "Mr Ding"
输出:"rM gniD"s

思路:

利用双指针先将字符串转化为List,因为字符串不可反转,然后把字符串反转,然后再根据每个单词间利用空格隔开之后再把单词位置进行反转即可。

python 复制代码
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())

难点:

1. 子函数 reservewords(单词字符反转)的实现难点
  • 字符不可变的处理 :Python 中字符串是不可变类型,无法直接交换字符位置。代码中先将单词转为列表(word=list(word)),交换后再通过 ''.join(word) 转回字符串 ------ 这是处理字符串原地修改的关键技巧,也是新手容易踩坑的点(若直接操作字符串会报错)。
2. 原字符串的分割与拼接逻辑
  • split () 方法的隐式处理s.split() 会自动忽略首尾空格多个连续空格 ,仅按「单个空格」分割成单词列表(例如 " hello world " 分割后是 ["hello", "world"])。若误用 s.split(' '),则会保留空字符串(如上述例子分割后是 ["", "", "hello", "", "", "world", "", ""]),导致后续反转空字符串、拼接出多余空格 ------ 这是字符串分割的高频易错点。
  • 生成器表达式的高效性reservewords(i) for i in s.split() 是生成器表达式,而非列表推导式。它无需先构建完整列表,而是边遍历边反转,节省内存(尤其处理长字符串时)。新手可能会写成 [reservewords(i) for i in s.split()],虽然结果正确,但内存效率稍低,理解生成器与列表的区别是进阶难点。
3. 整体逻辑的易混淆点
  • 反转粒度的区分 :题目要求「反转每个单词的字符」,而非「反转单词的顺序」。新手容易误将整个字符串反转后再分割(如先反转 "abc def" 得到 "fed cba",再分割反转每个单词),或直接反转单词列表(得到 "def abc"),核心是精准理解「反转范围」。
  • 无多余空格的拼接' '.join(...) 会在单词间仅拼接一个空格,天然规避了原字符串中多余空格的问题。若手动遍历拼接(如循环加空格),容易出现首尾空格或多空格,join 方法的正确使用是简化逻辑的关键。
相关推荐
-dzk-4 小时前
【代码随想录】LC 59.螺旋矩阵 II
c++·线性代数·算法·矩阵·模拟
风筝在晴天搁浅4 小时前
hot100 78.子集
java·算法
Jasmine_llq4 小时前
《P4587 [FJOI2016] 神秘数》
算法·倍增思想·稀疏表(st 表)·前缀和数组(解决静态区间和查询·st表核心实现高效预处理和查询·预处理优化(提前计算所需信息·快速io提升大规模数据读写效率
超级大只老咪4 小时前
快速进制转换
笔记·算法
m0_706653234 小时前
C++编译期数组操作
开发语言·c++·算法
故事和你915 小时前
sdut-Java面向对象-06 继承和多态、抽象类和接口(函数题:10-18题)
java·开发语言·算法·面向对象·基础语法·继承和多态·抽象类和接口
qq_423233905 小时前
C++与Python混合编程实战
开发语言·c++·算法
TracyCoder1235 小时前
LeetCode Hot100(19/100)——206. 反转链表
算法·leetcode
m0_715575345 小时前
分布式任务调度系统
开发语言·c++·算法