1.实现一个函数,可以左旋字符串中的n个字符
代码思路:
先将左旋的字符串倒置,然后倒置它之后的字符串,最后再将整个字符串都倒置,这就致我们想要的结果了。
比如:旋转2个字符 ASDFGH
倒置要旋转的字符串为 SADFGH
将它后面的字符串倒置为 SAHGFD
将整个字符串倒置为 DFGHAS
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
void Exchange(char *p, char *q)//将一串字符串倒置
{
while(p < q)
{
char tmp = *p;
*p = *q;
*q = tmp;
p++;
q--;
}
}
void Inversion(char a[],int sz,int n)
{
Exchange(&a[0], &a[n-1]);//倒置要旋转的字符
Exchange(&a[n], &a[sz-1]);//倒置旋转字符串之后的字符串
Exchange(&a[0], &a[sz-1]);//倒置整个字符串
}
int main()
{
char arr[] = {0};
int x = 0;
int s = 0;
printf("请输入要左旋的字符数\n");
scanf("%d", &x);
printf("请输入字符串\n");
scanf("%s", arr);
s = strlen(arr);
Inversion(arr, s, x);
printf("%s", arr);
system("pause");
return 0;
}
2. 判断一个字符是否由另一个字符旋转之后的字符串(无论是左旋还是右旋都可以)
代码思路和上一个相似。
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
void Judge(char *p,char *q)//倒置一个字符串
{
while(p < q)
{
char a = *p;
*p = *q;
*q = a;
p++;
q--;
}
}
int Inversion(char ass[], char s[], int x)
{
int i = 0;
char *a = malloc(x);
//左旋
for(i = 0; i < x; i++)
{
strcpy(a, ass);
Judge(&a[0],&a[i]);
Judge(&a[i+1],&a[x-1]);
Judge(&a[0],&a[x-1]);
if(strcmp(a, s) == 0)
{
return 1;
}
}
//右旋
for(i = x-1; i >= 0; i--)
{
strcpy(a, ass);
Judge(&a[x-1],&a[i]);
Judge(&a[i-1],&a[0]);
Judge(&a[x-1],&a[0]);
if(strcmp(a, s) == 0) //判断两个字符串是否相等
{
return 1;
}
}
return 0;
free(a);
}
int main()
{
char arr[] = "ASDFGH";
char b[] = "GHASDF";
int s = 0;
int ret = 0;
s = strlen(arr);
ret = Inversion(arr, b, s);
if(ret == 1)
{
printf("可以由原字符串旋转得到\n");
}
else
{
printf("不可以由原字符串旋转得到\n");
}
system("pause");
return 0;
}