1,假设输入:12345679
循环右移3位
输出结果为:67912345
解法一:不用库函数,而用遍历和交换的方法,时间复杂度O(m*n),空间复杂度O(1).
代码如下:
#include
#define maxsize 20
int main(void)
{
int len,n,k,m;
char temp;
char s[maxsize];
printf("***********************\n");
printf(" 字符串循环右移n位算法 \n");
printf("***********************\n");
printf("请输入字符串的值:\n");
printf("\n");
scanf("%s",s);
printf("\n");
printf("请输入字符串循环右移的位数n:");
scanf("%d",&n);
printf("\n");
len=strlen(s);
int j=len-1;
for(int i=1;i<=n;i++)
{
k=j-1;
temp=s[j];
while(k>=0)
{
s[k+1]=s[k];
k--;
}
s[0]=temp;
}
printf("输出字符串循环右移%d位的结果:%s",n,s);
printf("\n");
printf("\n");
return 0;
}
运行结果示意图如下:
解法二,用库函数strcpy,strncpy,strcat。时间复杂度O(n),空间复杂度O(n)。
代码如下:
#include "stdafx.h"
#include
#include
#include
#define MAXSIZE 100
void loopMove(char *ch,int steps)
{
char*temp;
char *final;
char*p;
temp=(char*)malloc(20);
final=(char*)malloc(20);
int n=strlen(ch)-steps;
p=ch+n;
strncpy(temp,ch,n);//将字符串ch前n个字符复制到temp中去。
*(temp+n)='\0';//因为复制的只是字符串ch中的前n个字符,不包括'\0',所以复制后的temp需要加上字符串结束标志符。
strcpy(final,p);
strcat(final,temp);
printf("%s\n",final);
printf("\n");
}
void main()
{
int n;
char s[MAXSIZE];
printf("***********************\n");
printf(" 字符串循环右移n位算法 \n");
printf("***********************\n");
printf("请输入字符串的值(字符串长度N<%d):\n",MAXSIZE);
scanf("%s",s);
printf("\n");
printf("请输入字符串循环右移的位数n:");
scanf("%d",&n);
loopMove(s,n);
}
运行结果示意图如下:
解法三,采用内存操作的方式,使用memcpy()函数。代码如下
#include "stdafx.h"
#include
#include
#include
#define MAXSIZE 100
void loopMove(char *ch,int steps)
{
char temp[MAXSIZE];
char*p;
int n=strlen(ch)-steps;
p=ch+n;
memcpy(temp,p,steps);
memcpy(temp+steps,ch,n);
memcpy(ch,temp,strlen(ch));
}
void main()
{
int n;
char s[MAXSIZE];
printf("***********************\n");
printf(" 字符串循环右移n位算法 \n");
printf("***********************\n");
printf("请输入字符串的值(字符串长度N<%d):\n",MAXSIZE);
scanf("%s",s);
printf("\n");
printf("请输入字符串循环右移的位数n:");
scanf("%d",&n);
loopMove(s,n);
printf("%s\n",s);
printf("\n");
}
运行结果示意图如下:
解法四:采用字符串逆置的方式,时间复杂度为O(n)。
代码如下:
#include "stdafx.h"
#include
#include
#include
#define MAXSIZE 100
/*
函数功能:实现字符串中[m……n]字符的逆置。
*/
void invert(char ch[],int m,int n)
{
int i;
char temp;
for(i=m;i<(m+n)/2;i++)
{
temp=ch[i];
ch[i]=ch[m+n-1-i];
ch[m+n-1-i]=temp;
}
}
/*实现循环移位
比如:123456,循环右移2位,实际上是将字符串分成两部分
先对1234逆置,得到4321
再对56逆置,得到65
此时字符串是432165
最后再对整个字符串432165逆置,得到561234。实现了循环移位
时间复杂度在线性时间内。
*/
void loopMove(char c[],int steps)
{
int len;
len=strlen(c)-steps;
invert(c,0,len);//对字符串中前len位进行逆置
invert(c,len,strlen(c));//对字符串后steps位进行逆置
invert(c,0,strlen(c));//再对整个字符串进行逆置
}
void main()
{
int n;
char s[MAXSIZE];
printf("***********************\n");
printf(" 字符串循环右移N位算法 \n");
printf("***********************\n");
printf("请输入字符串的值(字符串长度N<%d):\n",MAXSIZE);
scanf("%s",s);
printf("\n");
printf("请输入字符串循环右移的位数n:");
scanf("%d",&n);
loopMove(s,n);
printf("输出字符串循环右移%d的结果;\n",n);
printf("%s\n",s);
printf("\n");
}
运行结果如下: