版权声明:made by YYT https://blog.csdn.net/qq_37621506/article/details/83513868
1.题目
给定一个字符串和一个整数 k,你需要对从字符串开头算起的每个 2k 个字符的前k个字符进行反转。如果剩余少于 k 个字符,则将剩余的所有全部反转。如果有小于 2k 但大于或等于 k 个字符,则反转前 k 个字符,并将剩余的字符保持原样。
2.思路
step1:把字符串长度、对2k取余剩下的数字,以及÷2k得到的结果存储下来;
step2:先把钱2k个字符的前k个字符翻转
step3:讨论余数大小情况
3.代码
class Solution {
public:
string reverseStr(string s, int k){
int len=s.length();
int bus=len/(2*k);
int rem=len%(2*k);
for(int i=0;i<bus;i++){
for(int m=0,sta=i*k*2; m<k/2; m++){//翻转每2K个字符的前K个字符
char temp = s[sta];
s[sta] = s[sta+ k-1 - m*2];
s[sta+ k-1 - m*2] = temp;
sta++;
}
}
if(rem<k){//剩余少于k个字符,将所有字符都反转 (剩余必定小于2k个字符)
for(int m=0,sta=bus*k*2; m<rem/2; m++){
char temp=s[sta];
s[sta]=s[sta+rem-1-m*2];
s[sta+rem-1-m*2]=temp;
sta++;
}
}
else{//小于2k但大于或等于k个字符,反转前k个字符
for(int m=0,sta=bus*k*2; m<k/2; m++){//翻转前K个字符
char temp=s[sta];
s[sta]=s[sta+k-1-m*2];
s[sta+k-1-m*2]=temp;
sta++;
}
}
for(int i=0;i<s.length();i++)
cout<<s[i];
cout<<endl;
return s;
}
};
4.优秀案例
class Solution {
public:
string reverseStr(string s, int k) {
for(int i=0;i<s.size()-1;i+=2*k)
{
reverse(s.begin()+i,min(s.begin()+i+k,s.end()));
}
return s;