读书笔记--字符串循环移位
问题描述:将一个字符串例如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;
}
读《程序员编程艺术》笔记