反转字符串Ⅱ
算法-反转字符串Ⅱ
背景
-
算法–反转字符串Ⅱ
-
博主以代码随想录算法公开课进行学习
题目
-
给定一个字符串 s 和一个整数 k,从字符串开头算起, 每计数至 2k 个字符,就反转这 2k 个字符中的前 k 个字符。
如果剩余字符少于 k 个,则将剩余字符全部反转。
如果剩余字符小于 2k 但大于或等于 k 个,则反转前 k 个字符,其余字符保持原样。
示例:
输入: s = “abcdefg”, k = 2
输出: “bacdfeg”
思路
- 分段遍历 + 双指针反转
- 分段逻辑:将字符串按 2k 长度分段,遍历步长设为 2k(
i += 2*k); - 边界处理:对每一段,计算反转的结束指针 end:
- 若剩余字符 ≥k → end = start + k - 1;
- 若剩余字符 <k → end = 数组最后一个索引(用
Math.min统一处理);
- 复用基础反转:在 [start, end] 区间内,用“双指针+临时变量交换”反转字符;
- 类型转换:String 不可变,先转为 char[] 原地修改,最后转回 String。
代码
1 | ## 代码 |
总结
- 核心难点:end指针的边界计算(
Math.min的使用),解决“剩余字符不足k”的越界问题; Math.min(a, b)取 a 和 b 中的较小值