第十六天 反转字符串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)\),每个字符最多被反转一次,循环和反转的操作都是线性的,没有多余的嵌套循环,这让我更理解了 "局部反转" 类问题的时间复杂度优化思路。
相关推荐
smj2302_796826528 分钟前
解决leetcode第3934题最短唯一子数组
数据结构·python·算法·leetcode
iiiiyu17 分钟前
面向对象和集合编程题
java·开发语言·前端·数据结构·算法·编程语言
变量未定义~20 分钟前
最长回文子串
数据结构·算法
代码中介商29 分钟前
AVL树:自平衡二叉搜索树的奥秘
数据结构
玛卡巴卡ldf2 小时前
【LeetCode 手撕算法】(多维动态规划)不同路径、最小路径和、最长回文子串、最长公共子序列、编辑距离
java·数据结构·算法·leetcode·动态规划·力扣
被AI抢饭碗的人2 小时前
算法:数据结构
数据结构·算法
淞綰2 小时前
c语言的练习-字符串的练习-寻找最长连续字符以及出现次数
c语言·数据结构·学习·算法·c语言的练习
qq_296553273 小时前
[特殊字符] 搜索插入位置:从O(n)到O(log n)的优雅进化
数据结构·算法·面试·分类·柔性数组
凯瑟琳.奥古斯特3 小时前
力扣3654:二维矩阵连续空位统计
数据结构·数据库·算法·职场和发展
故事和你913 小时前
洛谷-【图论2-2】最短路3
开发语言·数据结构·c++·算法·动态规划·图论