image-20241110120340977

思路1.我的代码

比起反转字符串多了几个条件

定义两个指针left和right,

当len-left>2k时,right向右走k-1,然后反转

当len-left<k时,反转left到len-1

当len-left>=k&&len-left<2*k,反转left,left+k-1

代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
void reverseString(char* s, int left,int right) {
while(left<right){
char temp=s[left];
s[left]=s[right];
s[right]=temp;
left++;
right--;
}
}


char* reverseStr(char* s, int k) {
int left=0;
int right=0;
int len=strlen(s);
while(len-left>=2*k){
right+=k-1;
reverseString(s,left,right);
left+=2*k;
right=left;
}
if(len-left<k){
reverseString(s,left,len-1);
}
else if(len-left>=k&&len-left<2*k){
reverseString(s,left,left+k-1);
}

return s;
}

思路2,直接循环

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
void reverseString(char* s, int left,int right) {
while(left<right){
char temp=s[left];
s[left]=s[right];
s[right]=temp;
left++;
right--;
}
}
int min(int x,int y){
return x>y?y:x;
}

char* reverseStr(char* s, int k) {
int len=strlen(s);
for(int i =0;i<len; i+=2*k){
//取数组长度和反转终止点的最小值,就不用分情况讨论
reverseString(s,i,min(i+k,len)-1);
}
return s;
}