题目
反转字符串
信息
- 类型:问答
- 难度:⭐
考点
数组遍历,双指针技巧,字符串操作
快速回答
使用双指针技巧原地反转字符串:
- 初始化左指针
left = 0,右指针right = len(s)-1 - 当
left < right时循环:- 交换
s[left]和s[right] - 左指针右移:
left++ - 右指针左移:
right--
- 交换
- 时间复杂度 O(n),空间复杂度 O(1)
原理说明
反转字符串的核心是交换首尾对应位置的字符:
- 双指针技巧:使用两个指针分别从数组头部和尾部向中间移动,每次交换指针位置的元素
- 原地修改:直接在原数组上操作,不创建新数组,节省空间
- 终止条件:当左指针超过或等于右指针时停止,确保每个元素只交换一次
代码示例
def reverse_string(s: list) -> None:
left, right = 0, len(s) - 1
while left < right:
s[left], s[right] = s[right], s[left] # 交换字符
left += 1
right -= 1
# 示例用法
chars = ['h','e','l','l','o']
reverse_string(chars)
print(chars) # 输出 ['o','l','l','e','h']最佳实践
- 边界处理:自动兼容空数组和单元素数组(无需特殊处理)
- 语言适配:
- Python:字符串不可变,需先转为
list再转回字符串 - Java/C++:可直接操作字符数组
char[]
- Python:字符串不可变,需先转为
- 循环优化:使用
while left < right比for循环更直观
常见错误
- 忽略字符串不可变性:在 Python/Java 中直接操作字符串会报错,需先转为可变结构
- 指针移动错误:
- 忘记移动指针导致死循环
- 错误使用
left <= right导致中间元素被交换两次
- 创建新数组:使用
s[::-1]等语法不符合原地修改的要求
扩展知识
- 字符串不可变性:Python/Java 中字符串不可修改,反转需转为字符数组
- 相关算法:
- 反转单词顺序(先整体反转再逐单词反转)
- 旋转数组(三次反转法)
- 双指针应用场景:两数之和、移除元素、回文校验等