第十六天 反转字符串II

建议:本题又进阶了,自己先去独立做一做,然后在看题解,对代码技巧会有很深的体会。

题目链接:https://leetcode.cn/problems/reverse-string-ii/ 视频链接:https://www.bilibili.com/video/BV1dT411j7NN

一、看到题目的第一想法

  1. 题目要求理解 :给定一个字符串 s 和整数 k,规则是:
    • 每计数 2k 个字符,就反转前 k 个字符;
    • 如果剩余字符少于 k 个,则全部反转;
    • 如果剩余字符大于等于 k 但小于 2k 个,则反转前 k 个字符。
  2. 核心思路 :直接按题目规则,用一个步长为 2k 的循环来遍历字符串。每次循环里,反转当前区间内的前 k 个字符,同时用 min() 函数处理字符串末尾不足 k 个字符的情况,避免越界。
  3. 初步实现念头
    • for (int i = 0; i < n; i += 2*k) 作为外层循环,每次跳 2k 步。
    • 反转区间是 [i, i+k),但要注意末尾的边界,所以结束位置用 min(i + k, n) 来保证不超出字符串长度。
    • 直接调用 C++ 标准库的 reverse() 函数来完成局部反转,简化代码。

二、实现过程中遇到的困难

  1. 边界条件的处理
    • 一开始没考虑字符串末尾不足 k 个字符的情况,直接写了 s.begin() + i + k,导致下标越界报错。后来才想到用 min(i + k, n) 来动态调整反转的结束位置,适配剩余字符数不足 k 的场景。
    • 步长的控制也容易出错:一开始错误地写成 i += k,导致重复反转或反转顺序错乱,后来才反应过来,题目是每 2k 个字符为一组处理,步长应该是 2*k
  2. reverse() 函数的使用细节
    • 一开始对 reverse() 的区间规则不熟悉:reverse(first, last) 反转的是 [first, last) 左闭右开区间,所以结束迭代器应该指向 "要反转的最后一个字符的下一个位置"。
    • 错误地把结束迭代器写成了 s.begin() + min(i + k, n) - 1,导致反转少了一个字符,后来才纠正过来。
  3. 对题目规则的理解偏差
    • 一开始误以为 "剩余字符少于 2k 个时,反转所有剩余字符",忽略了题目中 "剩余字符大于等于 k 时,只反转前 k 个" 的规则,导致部分测试用例不通过。
  4. 字符串长度为 0 或 1 的特殊情况
    • 一开始没考虑 s 为空或长度小于 k 的情况,后来发现 min(i + k, n) 和循环条件 i < n 天然处理了这些情况,不需要额外写 if 判断。

三、今日收获心得

  1. 对 "分段处理" 思想的掌握 这道题让我学会了如何按固定步长对字符串进行分段处理,通过 i += 2*k 的循环,把字符串拆成多个 2k 长度的片段,再对每个片段的前 k 个字符反转,这种思路可以推广到很多字符串分段操作的问题中。
  2. std::reverse 与迭代器的灵活使用
    • 彻底搞懂了 reverse() 函数的左闭右开区间规则,学会了用 s.begin() + i 这样的迭代器来定位字符串的任意位置,实现局部反转。
    • 也理解了 min() 函数在边界处理中的妙用,它能优雅地解决 "剩余字符不足 k" 的问题,避免了大量 if-else 判断,让代码更简洁。
  3. 对题目规则的严谨理解 这道题的规则有多个分支(大于等于 2k、大于等于 k 小于 2k、小于 k),但通过步长控制和 min() 函数,可以把所有分支用同一段代码处理,让我意识到:写代码前一定要把规则拆解得足够清晰,才能找到通用的解法。
  4. 代码简洁性与鲁棒性的提升 原来以为要写很多条件判断的逻辑,用步长循环和 min() 函数就能一行搞定,既减少了冗余代码,也降低了出错概率。同时也体会到了 C++ 标准库函数在处理这类问题时的便利性。
  5. 对时间复杂度的理解加深整个算法的时间复杂度是 \(O(n)\),每个字符最多被反转一次,循环和反转的操作都是线性的,没有多余的嵌套循环,这让我更理解了 "局部反转" 类问题的时间复杂度优化思路。
相关推荐
吴阿福|一人公司41 分钟前
深度解析 Python 类变量修改的命名空间隔离
java·服务器·数据结构
不知名的老吴1 小时前
经典算法题之行星碰撞
数据结构·算法
丘山望岳1 小时前
剑起霜华——平衡二叉树(AVL树 )精讲
开发语言·数据结构·c++
LuminousCPP2 小时前
数据结构 - 单链表第一篇:单链表基础操作
c语言·数据结构·经验分享·笔记·学习
WL学习笔记2 小时前
通讯录(顺序表实现)
c语言·数据结构·算法
JieE2122 小时前
树与二叉树--JS实例
javascript·数据结构
To_OC2 小时前
搞懂二叉树递归遍历,我居然是从爬楼梯开始的
前端·javascript·数据结构
果丁智能2 小时前
智慧校园一卡通深度融合方案:基于超级SIM卡的手机碰一碰智能开锁技术落地实践
数据结构·人工智能·python·科技·算法·智能家居·信息与通信
Irissgwe3 小时前
顺序表和链表
数据结构·c++·链表·c·顺序表·线性表
小糯米6013 小时前
C语言文件操作
c语言·开发语言·数据结构