左旋字符串

来源:互联网 发布:php开源cms 编辑:程序博客网 时间:2024/06/07 23:07

        首先声明,本文是在http://blog.csdn.net/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-- ;  }}




0 0