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

问题描述:将一个字符串例如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;  
}  

 

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

 

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值