给定一个字符串 s 和一个整数 k,从字符串开头算起,每 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
思路:
遍历字符串的过程中,只要让 i += (2 * k)
,i 每次移动 2 * k 。
1.有2k个字符,反转前k个
2.有[k,2k)个字符,反转前k个
3.剩余[0,k)个字符,全部反转
AC代码:(C++)
class Solution {
public:
void reverse(string& s, int start, int end) {
int i = start, j = end;
while (i < j) {
swap(s[i], s[j]);
i++;
j--;
}
}
string reverseStr(string s, int k) {
for (int i = 0; i < s.size(); i += (2 * k)) {
//1.有2k个字符,反转前k个
//2.有[k,2k)个字符,反转前k个
if (i + k <= s.size()) {
reverse(s, i, i + k - 1);
continue;
}
//3.剩余[0,k)个字符,全部反转
reverse(s, i, s.size() - 1);
}
return s;
}
};