题目

给定一个字符串 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

解答

  • 直接进行交换即可
class Solution {
public:
    string reverseStr(string s, int k) {
        int n = s.size(); // 字符串的长度
        for (int i = 0; i < n; i += 2 * k) { // 每 2k 个字符为一组进行反转
            int left = i; // 左边界
            int right = min(i + k - 1, n - 1); // 右边界,注意防止越界
            while (left < right) { // 双指针反转
                swap(s[left], s[right]); // 交换左右指针对应的字符。
                left++;
                right--; // 左右指针向中间移动。
            }
        }
        return s; // 返回反转后的字符串
    }
};