一、题目描述
二、思路
同 打卡 DAY 23 反转字符串 相同,其中还需要注意每次反转的起点(i += (2 * k))与终点。
三、解题思路
-
实现字符串反转接口函数
void reverseString(char* s, int left, int right){
while(left < right){
char tmp = s[left];
s[left] = s[right];
s[right] = tmp;
left ++;
right --;
}
}
-
初始化反转起点 i 与字符串长度
int i = 0;
int len = strlen(s);
-
进入循环
- 当左指针小于右指针时,判断 i 到 i + k - 1 之间元素是否都存在(即不溢出)若都存在,则交换元素的区间为[ i , i + k - 1 ];若不都存在,则交换元素的区间为[ i , len - 1 ]:
for(; i < len; i += (2 * k)){
if((i + k - 1) < len){
reverseString(s, i, i + k - 1);
}else{
reverseString(s, i, len - 1);
}
}
return s;
四、代码
void reverseString(char* s, int left, int right){
while(left < right){
char tmp = s[left];
s[left] = s[right];
s[right] = tmp;
left ++;
right --;
}
}
char * reverseStr(char * s, int k){
int i = 0;
int len = strlen(s);
for(; i < len; i += (2 * k)){
if((i + k - 1) < len){
reverseString(s, i, i + k - 1);
}else{
reverseString(s, i, len - 1);
}
}
return s;
}
时间复杂度:O(n),空间复杂度:O(1)。