【简单】力扣算法题解析LeetCode344:反转字符串

关注文末推广名片,即可免费获得本题测试源码

题目来源: LeetCode 344:反转字符串

问题抽象: 给定一个 字符数组 s(由 ASCII 字符组成),要求 原地修改数组 将其内容 完全反转(即原顺序的逆序),满足以下核心需求:

  1. 反转规则

    • 数组首位与末位交换、次位与次末位交换,依此类推(形式化:s[i]s[n-1-i] 交换,0 ≤ i < n/2);
    • 操作后原字符串逆序存储于同一数组中。
  2. 操作约束

    • 空间复杂度 O(1):禁止使用额外数组(仅允许常数级临时变量);
    • 时间复杂度 O(n):遍历至多 n/2 次(n 为数组长度);
    • 原地修改:直接操作输入数组,无返回值(函数返回 void)。
  3. 边界处理

    • 空数组s.length=0):无需操作;
    • 单字符数组:无需交换(反转后不变);
    • 奇偶长度
      • 奇数长度(如 5):中间字符位置不变;
      • 偶数长度(如 4):全部两两交换。
  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 修改为反转后的数组)。


解题思路

使用 双指针法 在数组上直接交换字符:

  1. 初始化指针:左指针 left = 0,右指针 right = s.length - 1
  2. 交换字符:当 left < right 时,交换 s[left]s[right] 的值。
  3. 移动指针:交换后 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--;
        }
    }
}

代码说明

  1. 双指针操作
    • left 从数组起始位置(索引 0)向右移动。
    • right 从数组末尾位置(索引 s.length-1)向左移动。
  2. 交换逻辑
    • 通过临时变量 temp 交换 s[left]s[right] 的值。
    • 每交换一次,left 增加 1right 减少 1
  3. 终止条件
    • left >= right 时停止(偶数长度时 left > right,奇数长度时 left == right)。
  4. 原地修改
    • 直接在输入数组 s 上操作,无额外空间开销。

提交详情(执行用时、内存消耗)

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

达文汐

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值