反转字符串——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; }