您的位置:首页 > 编程语言 > PHP开发

读书笔记--字符串循环移位

2012-04-05 17:36 176 查看
问题描述:将一个字符串例如abcd123向左旋转移位4位变为123abcd;或者右移4位变为d1234abc;要求写一个函数实现对该字符串的这两种操作。

方法一:最容易想到的方法当然是(以左移为例)一次移动一位,一共移动四次,这样便可以将上述字符串左移4位。

abcd123-->bcd123a-->cd123ab-->d123abc-->123abcd

LeftShift(int* arr, int N, int K) //arr为字符串,N为字符串的长度,K为左移的长度

{

      K %= N;

      while(K--)

      {

           int t = arr[0];

           for(int i =0; i < N-2; i++)

                arr[i] = arr[i +1];

           arr[N-1] = t;

      }

}

方法二:

abcd123左移4位:

分成两部分:abcd 123

左部翻转:    dcba 123

右部翻转:    dcba 321

整体翻转:    123 abcd

 

abcd123右移4位:

分成两部分: abc d123

左部翻转:    cba d123

右部翻转:    cba 321d

整体翻转:    d123 abc

 

算法描述:

由上可知,当一个有m个字符的字符串要左移n位时,要将其分成左右两部分,分别有n和m-n个字符;

当一个有m个字符的字符串要右移n位时,要将其分成左右两部分,分别有m-n和n个字符;

然后对上面分割之后的两部分分别翻转形成新的字符串,最后再将得到的新字符串翻转就得到了我们需要的字符串

 

具体的实现代码为:

#include "stdafx.h"

#include <stdio.h>  

#include <string.h>

 

void SubRotate(char *start, char *end)  

{  

    while(start != NULL && end !=NULL && start<end)  

 {  

         char temp=*start;  

         *start=*end;  

         *end=temp;  

         start++;  

         end--;  

 }  

}  

  

void Rotate(char *str,int m, bool L_R)  

/**

str--要移位的字符转

m  --移位的位数

L_R--向左移位 0 ;向右移位 1;

  */

{  

 int len=strlen(str);

    if(str==NULL)  

        return ;     

    if(m>0&&m<=len)  

    {  

        char *xfirst,*xend;  

        char *yfirst,*yend;

  char *zfirst,*zend;

  if(0 == L_R)

  {

   xfirst=str;  

   xend=str+m-1;  

   yfirst=str+m;  

   yend=str+len-1; 

   zfirst=str;  

   zend=str+len-1;

  }

  else

  {

   xfirst=str;  

   xend=str+len-m-1;  

   yfirst=str+len-m;  

   yend=str+len-1; 

   zfirst=str;  

   zend=str+len-1;

  }

        SubRotate(xfirst,xend);  

        SubRotate(yfirst,yend);  

        SubRotate(zfirst,zend);  

    }  

}  

  

int main(void)  

{     

    char str[]="abcdefghij";

 /*

  这里不能写成char *str="abcdefghij";  它本身没错,等价于:const char *str = "abcdefghij"

  这将导致我们不能对str所指的字符串做任何修改。 "

  如果试图修改ps所指的字符串常量,所以将出现错误。

 */

    Rotate(str,3,1);  

    printf("%s/n",str);  

    return 0;  

}  

 

读《程序员编程艺术》笔记

 

 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  读书 zend null 算法 编程