左旋转字符串

26.左旋转字符串(字符串)
题目:
定义字符串的左旋转操作:把字符串前面的若干个字符移动到字符串的尾部。
如把字符串abcdef左旋转2位得到字符串cdefab。请实现字符串左旋转的函数。
要求时间对长度为n的字符串操作的复杂度为O(n),辅助内存为O(1)。
//coder:Lee,20120316


#include<stdio.h>
#include<assert.h>
void LeftRotate_Solution1(char *A,unsigned int length,unsigned int step)
{
assert(A!=NULL&&length>0&&step>0&&step<=length);
int start=0;
unsigned int MoveNum=0;
while (MoveNum<length)
{
char temp=A[start];
int pre=start;
int next=(start+step)%length;
while(next!=start)
{
A[pre]=A[next];
pre=next;
next=(next+step)%length;
++MoveNum;
}
A[pre]=temp;
++MoveNum;
++start;
}


}
void Swap(char *a,char *b)
{
*a=*a^*b;
*b=*a^*b;
*a=*a^*b;
}
void LeftRotate_Solution2(char *A,unsigned int length,unsigned int step)
{
assert(A!=NULL&&length>0&&step>0&&step<=length);
if(length-step==0)
return;
if(length-step>=step)
{
for (unsigned int i=0;i<step;i++)
Swap(A+i,A+step+i);
LeftRotate_Solution2(A+step,length-step,step);
}
else
{
for (unsigned int i=0;i<length-step;i++)
Swap(A+2*step-length+i,A+step+i);
LeftRotate_Solution2(A,step,2*step-length);
}

}
void Reverse(char A[],int length)
{
assert(A!=NULL&&length>0);
int p=0;
int q=length-1;

while(p<q)
{
Swap(&A[p],&A[q]);
++p;
--q;
}
}
void LeftRotate_Solution3(char *A,unsigned int length,unsigned int step)
{
assert(A!=NULL&&length>0&&step>0&&step<=length);
Reverse(A,step);
Reverse(A+step,length-step);
Reverse(A,length);
}
int main()
{
const int sizestr=8;
const int step=3;
char A[sizestr]="abcdefg";
for (int i=0;i<sizestr-1;i++)
{
printf("%c ",A[i]);
}
printf("\n");
LeftRotate_Solution3(A,sizestr-1,step);
for (i=0;i<sizestr-1;i++)
{
printf("%c ",A[i]);
}
return 0;


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值