原题
字符串简单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 <= 104
  • s 仅由小写英文组成
  • 1 <= k <= 104

查看原题

解题主线

  1. 块起点每次增加 2k,反转终点取 min(start + k - 1, n - 1)。

解法 1:分块双指针反转

把字符串转为字符数组,对每个 2k 块的前 k 个字符执行原地反转。

  • 时间复杂度: O(n)

  • 空间复杂度: O(n),字符数组与返回字符串

JAVA
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