1.实现一个函数,可以左旋字符串中的k个字符。
ABCD左旋一个字符得到BCDA
ABCD左旋两个字符得到CDAB
思路:
我们可以先让应该旋转的k个字符翻转,再让其他的字符翻转,最后一起翻转,就能够实现字符的旋转。
代码:
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<string.h>
void Reverse(char *p,char *q)//字符串的翻转
{
while(p < q)
{
char a = *p;
*p = *q;
*q = a;
p++;
q--;
}
}
void Leftturn(char *a, int len,int n)//旋转字符函数
{
Reverse(&a[0],&a[n-1]);//前k个字符翻转
Reverse(&a[n],&a[len-1]);//其它字符翻转
Reverse(&a[0],&a[len-1]);//所有字符一起翻转
}
int main()
{
char arr[] = "ABCDE";
int s = 0;
int sz = strlen(arr);
printf("请输入想要旋转字符个数\n");
scanf("%d",&s);
Leftturn(arr,sz,s);
printf("%s",arr);
return 0;
}
2.判断一个字符串是否为另外一个字符串旋转之后的字符串。
例如:给定s1 = AABCD和s2 = BCDAA,返回1,给定s1=abcd和s2=ACBD,返回0.
AABCD左旋一个字符得到ABCDA
AABCD左旋两个字符得到BCDAA
AABCD右旋一个字符得到DAABC
思路:
在上一题的基础上做出右旋,并且运用strcmp函数来进行验证。
代码:
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
void Reverse(char *p,char *q)
{
while(p < q)
{
char a = *p;
*p = *q;
*q = a;
p++;
q--;
}
}
int Judgeturn(char a[],char b[], int len)
{
int i = 0;
char *p = malloc(len);//开辟一个动态空间
// 左旋
for(i=0; i<len; i++)
{
strcpy(p,a);//将a字符串复制给动态p
Reverse(&p[0],&p[i]);
Reverse(&p[i+1],&p[len-1]);
Reverse(&p[0],&p[len-1]);
if(strcmp(p,b) == 0)//旋转后的字符串p与字符串b对比验证
{
return 1;
}
}
// 右旋
for(i=0; i<len; i++)
{
strcpy(p,a);
Reverse(&p[len-i],&p[len-1]);
Reverse(&p[0],&p[len-i-1]);
Reverse(&p[0],&p[len-1]);
if(strcmp(p,b) == 0)
{
return 1;
}
}
return 0;
free(p);
}
int main()
{
char arr[] = "ABCDE";
char s[] = "DEABC";
int sz = strlen(arr);
int ret = 0;
ret = Judgeturn(arr,s,sz);
if( ret == 1)
{
printf("是由原字符串旋转得到的\n");
}
else
{
printf("不是由原字符串旋转得到的\n");
}
return 0;
}