学习算法博客 ---第一章 左旋转字符串

全部来自http://blog.csdn.net/v_JULY_v/article/details/6322882

作者:July 

非常感谢作者能提供这么好的文章。。。。。


这里写下自己代码,留着复习用。。。

方法一:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define swap(x,y) ({                            \
        (void)(&x == &y);                       \
        typeof(x) _z;                           \
        _z = x;                                 \
         x = y;                                 \
         y =_z;                                 \
})

void Reverse(char *str,int Start,int End)
{       
        for( ; Start < End; ++Start, --End){    
                swap(str[Start],str[End]);
        }
        return;
}
char *Shift(char *str,int k)
{
        int N;
        if(str == NULL)
                return NULL;
        N = strlen(str);
        k %= N;
        if(k > 0){
                Reverse(str,0,N-k-1);
                Reverse(str,N-k,N-1);
                Reverse(str,0,N-1);
        }
        else{
                Reverse(str,0,-1-k);
                Reverse(str,0-k,N-1);
                Reverse(str,0,N-1);
        }
        return str;
}
方法二:

#define swap(x,y) ({                            \
        (void)(&x == &y);                       \
        typeof(x) _z;                           \
        _z = x;                                 \
         x = y;                                 \
         y =_z;                                 \
})



char *Shift(char *str, int k)
{
        if(str == NULL|| k<=0){
                return NULL;
        }   
        int N = strlen(str);
        k %= N;
        int p1 =0,p2 = k;
//先是p2能走多少走多少
        while(N - p2 >= k){ 
                int m = k;
                while(m--){
                        swap(str[p1],str[p2]);//因为这里用的宏,千万不能str[p1++]啊
                        ++p1;
                        ++p2;
                }   
        }   
//然后处理尾部
        while(p2 < N){ 
                int j=p2;
                while(j>p1){
                        swap(str[j-1],str[j]);
                        --j;
                }   
                ++p1;
                ++p2;

        }
        return str;
}


        scanf("%d",&num);
        char A[] ="abcd1234";
        puts(Shift(A,num));

        return 0;
}
方法三:


void Shift(char *str, int start,int end,int k,BOOL flag)
{
        if(str == NULL || k == 0 || start == end || start < 0)
                return;

        int N = end - start + 1;
        int i = N / k - 1;

        if(flag == TRUE){
                int p1 = start, p2 = p1 + k;
                while(i--){
                        int j = k;
                        for(;j>0;--j,++p1,++p2){
                                swap(str[p1],str[p2]);
                        }           
                }   
                Shift(str,p1,end,N % k,FALSE);
        }   
        else{
                int p1 = end - k, p2 = end;
                for(;i > 0;--i){
                        int j = k;
                        for(;j>0;--j,--p1,--p2){
                                swap(str[p1],str[p2]);
                        }   
                }   
                Shift(str,start,p2,N % k,TRUE);
        }   
        return;
}







  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值