算法打卡第十五天/反转字符串
2026/4/28 7:49:32 网站建设 项目流程

一、今日学习任务

第15天 双指针 + 字符串操作

1. 反转字符串
题目建议:本题是字符串基础题,核心考察双指针法的灵活运用,同时明确原地操作与空间复杂度的严格要求。需要区分手动实现反转逻辑与直接调用库函数的使用场景,在基础练习中优先掌握底层算法思想,为复杂字符串处理奠定基础。
题目链接:https://leetcode.cn/problems/reverse-string/
视频讲解:https://www.bilibili.com/video/BV1fV4y17748

二、初次解题思路和思考

拿到题目第一想法是直接使用语言内置的反转函数(如C++的reverse、Python的[::-1]),快速完成反转。
暴力解法/库函数调用的缺陷很明显:

1. 忽略了题目原地修改的核心要求,若直接生成新字符串,空间复杂度会达到O(n),不符合O(1)的进阶限制;

2. 依赖库函数会掩盖反转的底层逻辑,缺乏对双指针、数组交换等基础算法的锻炼,不利于后续复杂字符串题目的迁移;

3. 无法深入理解“双指针收缩区间”的核心思想,这类思想是后续反转链表、反转部分数组等题目的通用基础。

结合字符串与数组的关联特性,重新梳理思路:
字符串本质是字符数组,反转操作可转化为数组首尾元素交换,逐步向中间收缩,这是最贴合题目要求的核心思路。
核心优化思路:
采用左右双指针法,左指针从数组起始位置(下标0)出发,右指针从数组末尾位置(下标len-1)出发,循环交换两指针指向的字符,直到两指针相遇或交叉,完成原地反转,全程无额外空间开销。

三、写代码时核心注意点

1. 指针边界与移动规则

◦ 左指针初始值为0,右指针初始值为nums.size() - 1;

◦ 循环终止条件为left < right,若left == right,说明指向中间字符,无需交换(偶数长度数组指针交叉时终止,奇数长度数组指针相遇时终止);

◦ 每轮交换后,左指针右移(left++),右指针左移(right--)。

2. 原地操作的严格执行

◦ 不定义额外的字符数组或字符串存储结果,仅通过交换数组内元素完成反转;

◦ 直接修改输入的字符数组,符合题目“O(1)额外空间”的核心要求。

3. 语言特性适配(以C++为例)

◦ 字符数组为vector<char>类型,交换元素可直接使用swap函数,或通过临时变量中转实现;

◦ 注意数组长度获取:nums.size()返回无符号整数,与int类型比较时需避免隐式类型转换问题,本题中直接使用即可。

4. 效率与逻辑平衡

◦ 时间复杂度为O(n),n为字符数组长度,仅遍历一半数组,效率最优;

◦ 手动实现交换逻辑,不依赖内置库函数,兼顾算法思想掌握与题目要求。

四、操作

测试示例

输入:s = ["h","e","l","l","o"]
输出:["o","l","l","e","h"]
解释:双指针从首尾开始,依次交换h与o、e与l,中间l无需交换,最终完成反转。

输入:s = ["H","a","n","n","a","h"]
输出:["h","a","n","n","a","H"]
验证:双指针法严格遵循原地交换规则,无额外空间消耗,结果准确。

五、今天收获

1. 明确字符串反转的原地操作核心要求,区分“库函数调用”与“手动实现”的适用场景,基础算法练习中优先掌握底层逻辑;

2. 熟练掌握双指针法在字符串/数组反转中的应用,理解“首尾交换+区间收缩”的核心思想,为同类题目(如反转部分字符串、反转链表节点)搭建思维框架;

3. 强化O(1)空间复杂度的意识,养成不依赖额外存储、直接修改原数据的编程习惯,优化代码空间效率;

4. 巩固C++中vector容器的基本操作、swap函数的使用,以及指针边界控制的细节,提升代码严谨性。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询