1. 题目

给定一个字符串 s 和一个整数 k,你需要对从字符串开头算起的每隔 2k 个字符的前 k 个字符进行反转。
如果剩余字符少于 k 个,则将剩余字符全部反转。
如果剩余字符小于 2k 但大于或等于 k 个,则反转前 k 个字符,其余字符保持原样。

示例:

  1. 输入: s = "abcdefg", k = 2
  2. 输出: "bacdfeg"

image.png

提示:

该字符串只包含小写英文字母。
给定字符串的长度和 k[1, 10000] 范围内。

2. 代码(C++)


class Solution {
public:
    string reverseStr(string s, int k) {
        for (int i = 0; i <= s.size() / (2 * k); i++) {
            // 如果剩余字符少于 k 个,则将剩余字符全部反转。
            if ((2 * k * i + k - 1) > s.size() - 1) {
                reverseK(s, 2 * k * i + 0, s.size() - 1);
            }
            // 如果剩余字符小于 2k 但大于或等于 k 个,则反转前 k 个字符,其余字符保持原样。
            else if (((2 * k * i + k - 1) < s.size() - 1) && (2 * k * (i + 1)) > s.size() - 1) {
                reverseK(s, 2 * k * i + 0, 2 * k * i + k - 1);
            }
            // 正常反转
            else {
                reverseK(s, 2 * k * i + 0, 2 * k * i + k - 1);
            }
        }
        return s;
    }

    // 反转局部字符串
    void reverseK(string& str, const int& leftIndex, const int& rightIndex) {
        for (int i = leftIndex, j = rightIndex; i <= (rightIndex + leftIndex) / 2; i++, j--) {
            swap(str[i], str[j]);
        }
    }

};