每日一题
反转字符串——II
题目链接
思路
我们先来举几个例子来理解题目意思
- 字符串“ abcdefgh ”,k = 2,那么依据题目意思,反转后的字符串应该是“ bacdfegh ”(即每2k个字符,就反转前k个字符,且无剩余字符)
- 字符串“ abcdefg ”,k = 2,那么依据题目意思,反转后的字符串应该是“ bacdfeg ”(即当有剩余字符,且大于等于k个小于2k个时,反转前k个字符)
- 字符串“ abcdefgh ”,k = 3,那么依据题目意思,反转后的字符串应该是“ cbadefhg ”(即当有剩余字符,且小于k个时,将剩余字符全部反转)
看完上面的例子,就差不多能明白题目要我们做什么了,做了反转字符串——I,想必大家对字符串的反转已经熟悉了,那么这一题我们思考的主要是如何确定字符串反转的区间,也就是说如何做到每隔2k个字符就反转前k个字符,难道要用计数器来统计2k和它的前k个字符吗?这样做当然可以做出来,但显然效率不高。
其实,我们可以在遍历字符串的循环上稍作修改:
- 一般的我们遍历字符串是这样写的
for(int i = 0; i < strlen(s); i++) //s是字符串首地址 { `````````; }
- 但这一题我们可以进行这样的改进·
for(int i = 0; i < strlen(s); i += 2 * k) { `````````; }
- 这样我们就可以很方便的确定反转区间了。
实现代码
//对字符串s的i到k区间的字符进行反转
void S_reverseStr(char * s, int i, int k)
{
int left = i, right = k - 1;
while(left <= right)
{
char temp = s[left];
s[left] = s[right];
s[right] = temp;
left++;
right--;
}
return;
}
char * reverseStr(char * s, int k){
for(int i = 0; i < strlen(s); i+=2 * k)
{
//如果剩余的字符大于等于k,则反转前k个字符(包含了每2k个字符反转前k个字符的情况)
if(i + k <= strlen(s))
S_reverseStr(s,i,i+k);
//如果剩余的字符小于k,则全部反转
else
S_reverseStr(s,i,strlen(s));
}
return s;
}