方法一:逆序前一部分,逆序后一部分,整个逆序
abcdefg 左旋4位成 efgabcd
abcdefg -> dcba efg -> acba gfe -> efgabcd
char* Rotate1(char *str, int pos)
{
if(NULL==str)
{
return NULL;
}
int length = strlen(str);
if(0==length)
{
return NULL;
}
pos = pos % length;
Reverse(str,str+pos-1);
Reverse(str+pos, str+length-1);
Reverse(str, str+length-1);
return str;
}
char* Reverse(char *start, char *end)
{
if(NULL==start || NULL==end)
{
return NULL;
}
char *pTemp = start;
char temp;
while(start<end)
{
swap(start,end);
start++;
end--;
}
return pTemp;
}
方法二:逐个交换,然后处理尾部
abcdefg -> abc def g -> dbc aef g -> dec abf g -> def abc g -> 处理尾部def abg c -> def agb c -> def gab c
char* Rotate2(char *str, int pos)
{
if(NULL==str || pos<0)
{
return NULL;
}
int length = strlen(str);
if(0==length)
{
return NULL;
}
pos = pos % length;
int tail = length % pos;
int count = length - pos - tail;
char *p1 = str;
char *p2 = str + pos;
if(count>0)
{
char temp;
while(count--)
{
swap(p1, p2);
p1++;
p2++;
}
}
//处理尾部
for(int i=0; i<tail; i++)
{
char *p3 = p2 - 1;
char *p4 = p2;
while(p4>p1)
{
swap(p3,p4);
p3--;
p4--;
}
p2++;
p1++;
}
return str;
}
参考http://blog.csdn.net/v_JULY_v/article/details/6322882
参考的那个博客,还有好多种方法,可以学习一下