题目来源: LeetCode 344:反转字符串
问题抽象: 给定一个 字符数组 s(由 ASCII 字符组成),要求 原地修改数组 将其内容 完全反转(即原顺序的逆序),满足以下核心需求:
-
反转规则:
- 数组首位与末位交换、次位与次末位交换,依此类推(形式化:
s[i]与s[n-1-i]交换,0 ≤ i < n/2); - 操作后原字符串逆序存储于同一数组中。
- 数组首位与末位交换、次位与次末位交换,依此类推(形式化:
-
操作约束:
- 空间复杂度 O(1):禁止使用额外数组(仅允许常数级临时变量);
- 时间复杂度 O(n):遍历至多
n/2次(n为数组长度); - 原地修改:直接操作输入数组,无返回值(函数返回
void)。
-
边界处理:
- 空数组(
s.length=0):无需操作; - 单字符数组:无需交换(反转后不变);
- 奇偶长度:
- 奇数长度(如
5):中间字符位置不变; - 偶数长度(如
4):全部两两交换。
- 奇数长度(如
- 空数组(
-
特殊案例:
- 输入
["h","e","l","l","o"]→ 输出["o","l","l","e","h"]; - 输入
["H","a","n","n","a","h"]→ 输出["h","a","n","n","a","H"]; - 输入
["A"]→ 输出不变["A"]。
- 输入
输入:字符数组 s(长度范围 [0, 10^5])
输出:无返回值(s 修改为反转后的数组)。
解题思路
使用 双指针法 在数组上直接交换字符:
- 初始化指针:左指针
left = 0,右指针right = s.length - 1。 - 交换字符:当
left < right时,交换s[left]和s[right]的值。 - 移动指针:交换后
left右移,right左移,直到两指针相遇。
时间复杂度: O ( n ) O(n) O(n),遍历数组一半长度。 空间复杂度: O ( 1 ) O(1) O(1),仅使用常量临时变量。
代码实现(Java版)🔥点击下载源码
class Solution {
public void reverseString(char[] s) {
// 双指针:left从头部开始,right从尾部开始
int left = 0;
int right = s.length - 1;
// 当左指针小于右指针时,交换字符并移动指针
while (left < right) {
// 交换左右指针指向的字符
char temp = s[left];
s[left] = s[right];
s[right] = temp;
// 移动指针
left++;
right--;
}
}
}
代码说明
- 双指针操作:
left从数组起始位置(索引0)向右移动。right从数组末尾位置(索引s.length-1)向左移动。
- 交换逻辑:
- 通过临时变量
temp交换s[left]和s[right]的值。 - 每交换一次,
left增加1,right减少1。
- 通过临时变量
- 终止条件:
- 当
left >= right时停止(偶数长度时left > right,奇数长度时left == right)。
- 当
- 原地修改:
- 直接在输入数组
s上操作,无额外空间开销。
- 直接在输入数组
提交详情(执行用时、内存消耗)

1285

被折叠的 条评论
为什么被折叠?



