字符串不可变,需转为字符数组后用双指针原地交换,时间o(n)、空间o(1);java用tochararray()和new string(),c/c++注意'\0',python列表直接交换;空串或单字符无需处理,避免拼接或越界。

字符串本身不可变,要高效倒序排列,核心是转为可修改的字符数组,再用双指针原地交换——全程只用 O(1) 额外空间,时间复杂度稳定在 O(n)。
为什么必须先转成字符数组
Java、C++、Python(当处理 list 形式输入时)等语言中,原始字符串对象是不可变的。比如 Java 的 String 底层是 final char[],任何“修改”操作都会生成新对象,导致空间和时间开销剧增。所以第一步不是操作字符串,而是获取它的可写副本:
- Java:调用
s.toCharArray()得到char[] - C/C++:直接声明或传入可修改的
char str[],注意末尾'\0'不参与交换 - Python(力扣风格输入为
List[str]):输入已是可变列表,无需转换,直接交换元素
双指针原地交换的标准流程
这是最通用、最可控的实现方式,适用于所有支持索引访问的数组结构:
- 初始化左指针
left = 0,右指针right = length - 1 - 循环条件严格用
left ,避免越界或重复交换中心字符 - 每次迭代中:暂存
arr[left]→ 赋值arr[left] = arr[right]→ 赋值arr[right] = temp - 然后
left++,right--,继续下一对
不同语言的关键细节提醒
同一逻辑,在各语言落地时需注意底层差异:
- Java:返回前必须用
new String(arr)构造结果;toCharArray()是必要且唯一合理路径 - C/C++:计算长度时若用
sizeof(str),要减去'\0'(即sizeof(str) - 1或改用strlen()) - Python(输入为 list):可直接用元组解包交换,如
s[i], s[n-1-i] = s[n-1-i], s[i],简洁安全 - 边界处理:空串(
length == 0)或单字符(length == 1)直接跳过循环,不执行任何交换
别踩这些常见坑
看似简单,实操中高频出错点集中在空间与语义误解上:
- 误用
String +=拼接反转:每拼一次都新建对象,时间 O(n²),空间 O(n²) - 试图用
s.charAt(i)直接赋值:Java 字符串无 setter 方法,编译报错 - 循环写成
i 或 <code>j >= 0:可能越界或交换两次,破坏结果 - 忽略输入类型:力扣 344 题给的是
char[],不是String,不需要构造新字符串返回











