字符串简单1 种解法

#541反转字符串 II

每计数 2k 个字符,反转其中前 k 个;不足 k 个时反转全部剩余字符。

#字符串#双指针#模拟

解题主线

01

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

解法 1分块双指针反转

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

时间复杂度

O(n)

空间复杂度

O(n),字符数组与返回字符串

541. 反转字符串 II · 分块双指针反转
final class Solution {
    public String reverseStr(String s, int k) {
        if (k <= 0) throw new IllegalArgumentException("k must be positive");
        char[] chars = s.toCharArray();
        for (int start = 0; start < chars.length; start += 2 * 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;
        }
    }
}

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

边界与易错点

  • k 必须为正,否则步长 2k 会导致死循环。
  • 不足 2k 但至少有 k 个字符时,只反转前 k 个。
整理来源

由旧仓库源码复核、去重并整理;展示代码已按 Java 21 语义修正明显问题。

str/Q541_reverseStrII.java