1. 题目
给定一个字符串 s 和一个整数 k,你需要对从字符串开头算起的每隔 2k 个字符的前 k 个字符进行反转。
如果剩余字符少于 k 个,则将剩余字符全部反转。
如果剩余字符小于 2k 但大于或等于 k 个,则反转前 k 个字符,其余字符保持原样。
示例:
输入: s = "abcdefg", k = 2输出: "bacdfeg"

提示:
该字符串只包含小写英文字母。
给定字符串的长度和 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]);
}
}
};
