Skip to content

Commit d8c67b0

Browse files
authored
Create (字符串操作)541、反转字符串
1 parent 7454a68 commit d8c67b0

File tree

1 file changed

+49
-0
lines changed

1 file changed

+49
-0
lines changed
Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
/*
2+
给定一个字符串和一个整数 k,你需要对从字符串开头算起的每个 2k 个字符的前k个字符进行反转。如果剩余少于 k 个字符,则将剩余的所有全部反转。如果有小于 2k 但大于或等于 k 个字符,则反转前 k 个字符,并将剩余的字符保持原样。
3+
4+
示例:
5+
6+
输入: s = "abcdefg", k = 2
7+
输出: "bacdfeg"
8+
9+
要求:
10+
11+
该字符串只包含小写的英文字母。
12+
给定字符串的长度和 k 在[1, 10000]范围内.
13+
*/
14+
15+
void reverse(char* s, int p_left, int p_right)
16+
{
17+
while(p_left < p_right)
18+
{
19+
char tmp;
20+
tmp = s[p_left];
21+
s[p_left] = s[p_right];
22+
s[p_right] = tmp;
23+
24+
p_left++;
25+
p_right--;
26+
}
27+
}
28+
29+
char* reverseStr(char* s, int k)
30+
{
31+
int s_len = strlen(s);
32+
for(int i = 0; i < s_len; i += 2 * k)
33+
{
34+
if(i + 2 * k <= s_len || i + k <= s_len)
35+
reverse(s, i, i+k-1);
36+
else
37+
reverse(s, i, s_len-1);
38+
}
39+
return s;
40+
}
41+
42+
/*
43+
这道题就是在反转字符串1(整体字符串全部反转)的基础上,设置了反转区间进行分段反转。
44+
因此,可以直接将整体字符串反转的函数当做本函数的调用子函数,本函数的主体进行字符串的分段控制即可。
45+
分段相当于是将字符串中的每k个字符分成一组,交叉反转,所以循环的累加步长是2 * k;
46+
如果没有到最后一组,则满足i + 2 * k <= s_len;此时反转每一组中的前k个字符,即i到i+k-1区间;
47+
如果到了最后一组,若最后一组不到2*k个字符,则满足i + k <= s_len;此时反转字符串中的前k个字符,即i到i+k-1区间;
48+
如果到了最后一组,若最后一组不到k个字符,则从当前字符起到最后一个字符全部反转,即i到s_len-1区间。
49+
*/

0 commit comments

Comments
 (0)