字符串简单1 种解法
#541反转字符串 II
每计数 2k 个字符,反转其中前 k 个;不足 k 个时反转全部剩余字符。
#字符串#双指针#模拟
原题
给定一个字符串 s 和一个整数 k,从字符串开头算起,每计数至 2k 个字符,就反转这 2k 字符中的前 k 个字符,再重新计数。
- 如果剩余字符少于
k个,则将剩余字符全部反转。 - 如果剩余字符小于
2k但大于或等于k个,则反转前k个字符,其余字符保持原样。
示例 1:
输入:s = "abcdefg", k = 2 输出:"bacdfeg"
示例 2:
输入:s = "abcd", k = 2 输出:"bacd"
提示:
1 <= s.length <= 104s仅由小写英文组成1 <= k <= 104
解题主线
- 块起点每次增加 2k,反转终点取 min(start + k - 1, n - 1)。
解法 1:分块双指针反转
把字符串转为字符数组,对每个 2k 块的前 k 个字符执行原地反转。
-
时间复杂度: O(n)
-
空间复杂度: O(n),字符数组与返回字符串
final class Solution {
public String reverseStr(String s, int k) {
// 非正 k 会让分块步长失效,先拒绝非法输入。
if (k <= 0) throw new IllegalArgumentException("k must be positive");
char[] chars = s.toCharArray();
// 每个 2k 块只反转前 k 个字符。
for (int start = 0; start < chars.length; start += 2 * k) {
// 尾块不足 k 个字符时,将剩余部分全部反转。
reverse(chars, start, Math.min(start + k - 1, chars.length - 1));
}
return new String(chars);
}
private void reverse(char[] chars, int left, int right) {
while (left < right) {
char temporary = chars[left];
chars[left++] = chars[right];
chars[right--] = temporary;
}
}
}边界与易错点
- k 必须为正,否则步长 2k 会导致死循环。
- 不足 2k 但至少有 k 个字符时,只反转前 k 个。
整理来源
由旧仓库源码复核、去重并整理;展示代码已按 Java 21 语义修正明显问题。
str/Q541_reverseStrII.java