题目: 给定一个字符串 s 和一个整数 k,从字符串开头算起,每计数至 2k 个字符,就反转这 2k 字符中的前 k 个字符。如果剩余字符少于 k 个,则将剩余字符全部反转。如果剩余字符小于 2k 但大于或等于 k 个,则反转前 k 个字符,其余字符保持原样。
示例 1:
输入:s = “abcdefg”, k = 2
输出:“bacdfeg”
示例 2:
输入:s = “abcd”, k = 2
输出:“bacd”
思路:
在for循环中首先让每次循环的i值+2k位,再在循环中判断i+k的值是不是小于等于字符串的长度,如果是小于等于的,那么执行反转,如果不是小于等于那么执行if分支后边的reverse,从第i位到字符串长度位的反转,if语句中的continue是想让已经执行反转的代码跳过本次循环,继续执行下一次循环,不执行if后边的reverse语句。
void reverse(string& s,int left,int x) {
int right = x - 1;
while (left<right) {
char tmp = s[left];
s[left] = s[right];
s[right] = tmp;
left++;
right--;
}
}
int main() {
string s = "abcdefg";
int k = 2;
for (int i = 0; i < s.size();i+=2*k) {
if ((i+k)<=s.size()) {
reverse(s, i, i + k);
continue;
}
reverse(s,i,s.size());
}
cout << s << endl;
return 0;
}