问题描述
给定一个字符串,要求将字符串前面的若干字符移到字符串的尾部。例如:
将字符串“abcdef”的前3个字符’a’、’b’和’c’移到字符串的尾部,那么原字
符串将变成“defabc”,请写一个函数实现此功能.
思路:可通过三步翻转的方法实现
- step1:将原字符串分成两部分,一部分是字符串前面的“若干字符”X,另一部分是除了X的Y;
- step2:将X的所有字符翻转,即上面所说的,将”abc”翻转成”cba”,将”def”翻转成”fed”;
- step3:将整个字符串全部翻转–即将”cbafed”翻转成”defabc”。即实现了字符串前面若干字符移动到尾部。
时间复杂度为O(n)
代码如下:
代码一
/**********************
解题思路--- n步反转
step1:首先一空格为拆分,将字符串分为k个部分(向后取空格的原则);
step2:分别对这k个部分的子串进行反转
step3:最后对字符串整体反转
Author:tmw
date:2018-3-17
***********************/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define swap(x,y,t) (t=x,x=y,y=t)
void reverseString( char* str, int front, int end )
{
char temp;
while( front<end )
{
swap(str[front],str[end],temp);
front++;end--;
}
}
void three_steps_reverse( char* str )
{
int i = 0;
int j = 0;
int mark_left,mark_right;
while( i<strlen(str) )
{
while( i<strlen(str)&&str[i]!=' ' )
i++;
/**i此时指向空格,这里将坐标回移**/
i--;
/**保护i、j的游标不被改动**/
mark_left = j;
mark_right = i;
reverseString(str,mark_left,mark_right);
printf("%s\n",str);
j = i + 2; //j指向下一个单词的开头位置
i = j;
}
/**最后整体翻转**/
reverseString(str,0,strlen(str)-1);
}
代码二
/************************
Author:tmw
date:2017-11-29
************************/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define swap(x,y,t) (t=x,x=y,y=t)
void rotate(char* array , int low , int high )
{
int temp;
while(low<high)
{
swap(array[low],array[high],temp);
low++;
high--;
}
}
void three_steps_rotate(char* array , int rotate_part , int array_len )
{
rotate(array,0,rotate_part-1);
rotate(array,rotate_part,array_len-1);
rotate(array,0,array_len-1);
}
测试代码:
int main()
{
printf("测试代码!\n");
char a1[] = "abcdefghigk";
printf("原字符串为:%s\n",a1);
three_steps_rotate(a1,3,strlen(a1));
printf("旋转后的字符串为:%s\n",a1);
char a2[] = "zhongkeyuanjisuansuo";
printf("原字符串为:%s\n",a2);
three_steps_rotate(a2,4,strlen(a2));
printf("旋转后的字符串为:%s\n",a2);
return 0;
}
测试结果: