左旋转字符串
来源:互联网 发布:三星专用软件 编辑:程序博客网 时间:2024/04/30 02:16
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;
}
题目:
定义字符串的左旋转操作:把字符串前面的若干个字符移动到字符串的尾部。
如把字符串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;
}
- 左旋转字符串
- 左旋转字符串
- 左旋转字符串
- 左旋转字符串
- 左旋转字符串
- 26.左旋转字符串
- 第一章、左旋转字符串
- 字符串的左旋转
- 第一章、左旋转字符串
- 第一章、左旋转字符串
- 左旋转字符串
- 左旋转字符串
- 26、左旋转字符串
- 左旋转字符串
- 左旋转字符串
- 左旋转字符串
- 左旋转字符串
- 左旋转字符串
- 从今天开始,从新浪博客手动搬家至此。
- 线程--CyclicBarrier
- 简单讲述DES加密算法
- 第五周实验报告1
- linux 的库文件
- 左旋转字符串
- RLIB中内存的分配算法【已否决的】
- 第五周任务一(构造函数)
- 在Ubuntu 11.10下安装显卡,重启后,进不了界面
- vc中unicode项目向多字节字符集项目移植
- Python操作word
- C++中提供了多种基本的数据类型。实际上,这些远不能满足我们的需求,如复数(第10章的例子大多是处理虚数的),再如分数。本任务将设计一个简单的分数类,完成对分数的几个运算。一则巩固基于对象编程的方法,
- spring3依赖包下载
- SQLServer 的变量及赋值方法