算法day23 反转字符2
题目描述

思路:双指针
对于本题,我们可以先求解出我们能够完整遍历的2k的次数,随后再处理余下的长度不足2k的部分。在处理的过程中,我们将左右指针置于要遍历范围的两侧,使指针向中间移动,通过临时变量来辅助字符的互换。
代码如下:
string reverseStr(string s, int k) {
int cnt1 = s.size()/(2*k);//计算2k长度的遍历次数
int cnt2 = s.size()%(2*k);//计算余下的部分
int left = 0;
int right = s.size() > k ? k-1:s.size()-1;//初始化right,这里要考虑字符数组本身就长度不足k的情况
char temp;
int i = 0;//用来记录第几组2k区间,由0开始
while(cnt1--){
i++;
while(left<right){
temp = s[left];
s[left] = s[right];
s[right] = temp;
left++;
right--;
}
left = (2*k)*i;
right = k-1+left;
}
if(cnt2>k){
left = (s.size()/(2*k))*(2*k);
right = k-1+left;
while(left<right){
temp = s[left];
s[left] = s[right];
s[right] = temp;
left++;
right--;
}
}else{
left = (s.size()/(2*k))*(2*k);
right = s.size()-1;
while(left<right){
temp = s[left];
s[left] = s[right];
s[right] = temp;
left++;
right--;
}
}
return s;
}
2k步长版本(本质上没什么区别)
string reverseStr(string s, int k) {
int len = s.size();
int left;
int right;
char temp;
for(int i=0;i<len;i+=2*k){
if(i+k<=s.size()){
left = i;
right = i+k-1;
while(left<right){
temp = s[left];
s[left] = s[right];
s[right] = temp;
left++;
right--;
}
continue;
}
left = i;
right = s.size()-1;
while(left<right){
temp = s[left];
s[left] = s[right];
s[right] = temp;
left++;
right--;
}
}
return s;
}
时间复杂度:O(n)
空间复杂度:O(1)
END
浙公网安备 33010602011771号