开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第18天,点击查看活动详情
一、题目描述:
给定一个字符串 s 和一个整数 k,从字符串开头算起,每计数至 2k 个字符,就反转这 2k 字符中的前 k 个字符。
如果剩余字符少于 k 个,则将剩余字符全部反转。 如果剩余字符小于 2k 但大于或等于 k 个,则反转前 k 个字符,其余字符保持原样。
示例 1:
输入:s = "abcdefg", k = 2
输出:"bacdfeg"
示例 2:
输入:s = "abcd", k = 2
输出:"bacd"
提示:
- 1 <= s.length <= 10^4
- s 仅由小写英文组成
- 1 <= k <= 10^4
二、思路分析:
双指针,start指向要翻转的字符串的开头,end指向结尾,然后只要判断剩余字符的个数即可 若剩余字符数少于k个,即len - start - 1 < k,则end设为len - 1,调用函数翻转 其他情况,end直接设为start+k-1,然后调用函数即可 更新start = start + 2*k;
三、AC 代码:
void reverse(char *s, int start, int end)
{
int i = start,j = end;
char temp;
while(i < j)
{
temp = s[i];
s[i] = s[j];
s[j] = temp;
i++;
j--;
}
}
char * reverseStr(char * s, int k){
int len = strlen(s),start = 0,end;
while(start < len)
{
if(len - start - 1 < k) end = len - 1;
else end = start + k - 1;
reverse(s,start,end);
start = start + 2*k;
}
return s;
}
四、总结:
双指针,直接模拟即可。
- 将字符串分割为数组s.split('')
- 定义变量count用于计数当前遍历到第几个元素,变量start代表当前从第几个元素开始反转
- 进入循环令count++,判断count == 2k 则令下标为start到start + k - 1的元素反转,令start为当前遍历元素的下一位,重置count = 0
- 退出循环后判断count的区间范围,若大于k小于2k则反转start到start + k - 1的元素,若小于k则反转start到arr.length - 1的元素
范文参考:
ACM 选手图解 LeetCode 反转字符串Ⅱ | 编程文青李狗蛋 - 反转字符串 II - 力扣(LeetCode)
541. 反转字符串 II Javascript百分百解法!合理运用字符串的substr方法进行拼接 - 反转字符串 II - 力扣(LeetCode)