Leetcode344反转字符串
这道题挺简单的
双指针初始化:定义左指针 left 指向列表第一个元素(索引 0),右指针 right 指向列表最后一个元素(索引len(s)-1)。
相向交换元素:在 left < right 的条件下,循环交换 left 和 right 指针指向的元素(用临时变量 tmp 暂存值完成交换)。
指针移动收敛:每次交换后,左指针右移一位(left += 1),右指针左移一位(right -= 1),直到两指针相遇 / 交叉(left >= right),此时列表已完全反转。
class Solution:
def reverseString(self, s: List[str]) -> None:
"""
Do not return anything, modify s in-place instead.
"""
left=0
right=len(s)-1
while left<right:
tmp=s[left]
s[left]=s[right]
s[right]=tmp
left=left+1
right=right-1
class Solution {
public void reverseString(char[] s) {
int left=0;
int right=s.length-1;
while(left<right)
{
char tmp=s[left];
s[left]=s[right];
s[right]=tmp;
left++;
right–;
}
}
}
Leetcode541反转字符串2
这道题就是比反转字符串多了一点需要判断的地方,思路不难但是语法上有一些遗忘的地方
核心需求是:修改字符串中的部分字符,且要 “原地” 修改(避免额外内存开销)。
而 String 的不可变性导致:
Java代码
class Solution {
public String reverseStr(String s, int k) {
// 转为字符数组
char[] ch = s.toCharArray();
int len = ch.length;
// 每2k个字符为一个处理单元,步进2k
for (int i = 0; i < len; i += 2 * k) {
// 确定反转的结束位置:
// 1. 剩余字符不足k个:结束位置为最后一个字符(len-1)
// 2. 剩余字符>=k个:结束位置为i+k-1
int end = Math.min(i + k – 1, len – 1);
// 反转[i, end]区间的字符
reverse(ch, i, end);
}
// 字符数组转回字符串
return new String(ch);
}
// 辅助方法:反转字符数组中[start, end]区间的字符
private void reverse(char[] ch, int start, int end) {
// 双指针法反转区间内字符
while (start < end) {
char tmp = ch[start];
ch[start] = ch[end];
ch[end] = tmp;
start++;
end–;
}
}
}
语法细节
1.Java中的toCharArray String.toCharArray()
作用:把字符串的每个字符拆成一个 char 类型的数组,返回这个数组。
String s = "abc";
char[] ch = s.toCharArray();
System.out.println(ch[0]); // 输出 'a'
System.out.println(ch.length); // 输出 3
toCharArray() 是 String 类专属 的方法,作用是 “把字符串拆成 char[] 字符数组”;toArray() 是 Collection 集合接口(List/Set 等)专属 的方法,作用是 “把集合转成对象数组”;
2.为什么辅助函数不需要返回值
对于 int/char 这类基本类型:方法接收的是 “值的拷贝”,方法内修改不会影响原变量。
对于数组 / 对象这类引用类型:方法接收的是 “内存地址的拷贝”,但这个地址指向的是同一个数组对象。本质是直接修改原数组的内容,因此无需返回新数组,方法执行后原数组已经是反转后的状态。
3.Math.min
- 本质:就是一个 “比较两个数,返回更小值” 的工具方法,底层用三元运算符实现,没有复杂逻辑。
- 特点:静态方法,直接通过 Math.min(参数1, 参数2) 调用,无需创建 Math 对象。
4.字符数组转回字符串
char[] ch = {'a','b','c'};
String s = new String(ch);
ch[0] = 'x'; // 修改原数组
System.out.println(s); // 仍输出 "abc"(String 不受影响)
Python代码
class Solution:
def reverseStr(self, s: str, k: int) -> str:
# 将字符串转为列表(Python中字符串不可变,列表可修改)
s_list = list(s)
n = len(s_list)
# 每2k个字符为一个区间,步进2k
for i in range(0, n, 2 * k):
# 确定反转的结束位置:取 i+k-1 和 n-1 中较小的那个(等价于Java的Math.min)
end = min(i + k – 1, n – 1)
# 双指针反转 [i, end] 区间的字符
left, right = i, end
while left < right:
s_list[left], s_list[right] = s_list[right], s_list[left]
left += 1
right -= 1
# 将修改后的列表转回字符串
return ''.join(s_list)
语法细节
字符串转列表
为什么转列表不转数组,可以看我的数组基础那篇文章
s_list = list(s) # 比如 s="abc" → s_list = ['a','b','c']
pyhton的交换元素代码比较简洁
s_list[left], s_list[right] = s_list[right], s_list[left]
列表转回字符串
Python 用 ''.join(列表) 把字符列表拼接成字符串,是列表转字符串的标准方式:
return ''.join(s_list) # 比如 ['b','a','c'] → "bac"

![P11246 [GESP202409 六级] 小杨和整数拆分-171主机测评](https://www.171host.com/wp-content/uploads/2026/11/20261108100631-6af049a75855c-220x150.png)
![打卡信奥刷题(3678)用C++实现信奥题 P12274 [蓝桥杯 2024 国 Python B] 设计-171主机测评](https://www.171host.com/wp-content/uploads/2026/11/20261108053830-6af00ad6bdf8d-220x150.png)
