首先声明,本文是在http://blog.youkuaiyun.com/v_july_v/article/details/6322882程序员编程艺术:第一章、左旋转字符串 基础下完成的,也只是敲桥代码,以原来的代码为蓝本,修改了下,写了点注释,发现楼主文章的代码没有什么注释,只给了相关说明。第一次写博客,各位多指教。
楼主写了好几种方法,我才看了一种算法,下面是代码,代买在ubutun+gcc 环境下测试了下。
#include <stdio.h>
#include <string.h>
//将字符串左旋m位
void rotate(char *s ,int m) ;
//交换两个字符
void swap(char *p ,char *q) ;
int main()
{
/*
char a = 'Q' ;
char b = 'P' ;
printf("a = %c ,b == %c \n" ,a ,b) ;
swap(&a ,&b) ;
printf("swap :::a = %c ,b == %c \n" ,a ,b) ;
*/
char str[10] = "abcdefghij" ;
printf("str is %s\n" ,str) ;
rotate(str ,3) ;
printf("\n****************************************\n") ;
printf("rotate:: str is %s\n" ,str ) ;
printf("****************************************\n") ;
return 0 ;
}
//交换两个元素
void swap(char *p ,char* q)
{
char temp ;
temp = *p ;
*p = *q ;
*q = temp ;
}
void rotate(char *s ,int m)
{
//return 0 ;
if(strlen(s) == 0 || m <= 0 )
{
//返回,错误
return ;
}
int n = strlen(s) ;
printf("length = %d\n" ,n) ;
int p1 = 0 ;
int p2 = m ;
//n%m = 0 ,说明p1 p2相隔的距离被长度n整除
//n%m != 0 ,说明p1 p2相隔的距离不能被长度n整除
//k为第一阶段交换的次数
int k = n - m - n%m ;
while(k)
{
//交换p1 p2指向的元素
swap(&s[p1],&s[p2]) ;
p1++ ;
p2++ ; //p1 p2分别向后移动一个元素
k-- ;
}
//r 是剩下字符串的个数
int r = n - p2;
printf("r = %d \n" ,r) ;
//第二阶段的处理,当n%m = 0,第二阶段是不存在的,第一阶段就可以完成任务
//保持p1不动,p2往前交换元素
while(p2 > p1 )
{
//交换p1 p2 指向的元素
swap(&s[p2] ,&s[p2 -1 ] );
p2-- ;
}
}