1.实现一个函数,可以左旋字符串中的k个字符。
ABCD左旋一个字符得到BCDA
ABCD左旋两个字符得到CDAB
#include <stdio.h>
#include <stdlib.h>
int length (char *arr)
{
int i = 0;
while (arr[i])
{
i++;
}
return i;
}
void revolve_arr(char *arr, int len, int num)
{
int i = 0, j = 0, t = 0;
for (i=0; i<num; ++i)
{
for (j=0; j<len-1; ++j)
{
t = arr[j];
arr[j] = arr[j+1];
arr[j+1] = t;
}
}
}
int main()
{
char arr[10] = {"ABCDEFGHI"};
int num = 0;
int len = length (arr);
printf ("旋转前:\n%s\n",arr);
printf("请输入你要旋转的字符个数:\n");
scanf ("%d",&num);
revolve_arr(arr, len, num);
printf ("旋转后:\n%s\n",arr);
system ("pause");
return 0;
}
2.判断一个字符串是否为另外一个字符串旋转之后的字符串。
例如:给定s1 = AABCD和s2 = BCDAA,返回1,给定s1=abcd和s2=ACBD,返回0.
方法一:用第一个字符串旋转n次(n为字符串长度)后得到的字符串分别与第二个字符串比较,要是有相等的就说明第二个是第一个通过旋转得到的 ,如果都不相同就不是。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define NUM 6
int Is_revolve(char *arr1, char *arr2)
{
int i=0, j = 0;
char t = '0';
for (i=0; arr1[i]!='\0'; i++)
{
for (j = 0; arr1[j+1] != '\0'; ++j)
{
t = arr1[j];
arr1[j] = arr1[j+1];
arr1[j+1] = t;
}
if (strcmp(arr1, arr2) == 0)
{
return 1;
}
}
return 0;
}
int main()
{
int ret = 0;
char arr1[NUM];
char arr2[NUM];
printf ("arr1:\n");
scanf ("%s", arr1);
printf ("arr2:\n");
scanf ("%s", arr2);
char *p = arr1;
ret = Is_revolve(p, arr2);
if(ret == 1)
{
printf ("arr1是arr2旋转得到的!!!\n");
}
else
{
printf ("arr1不是arr2通过旋转得到的\n");
}
system ("pause");
return 0;
}
上面那个方法虽然可以判断结果,但是非常麻烦,需要多次循环比较才可以得出答案,所以通过对旋转后的字符串仔细观察就可以看出:
不管是左旋还是右旋,旋转后的字符串都是原字符串经过拷贝后的字符串的子串所以可以用判断子串的函数(strstr();)来判断,代码如下:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define NUM 6
int Is_revolve(char *arr3, char *arr2)
{
if((strstr(arr3, arr2)) != NULL)
return 1;
else
return 0;
}
int main()
{
int ret = 0;
char arr1[NUM];
char arr2[NUM];
char arr3[NUM+NUM+1];
printf ("arr1:\n");
scanf ("%s", arr1);
printf ("arr2:\n");
scanf ("%s", arr2);
strcpy (arr3, arr1);
strcat (arr3, arr1);
ret = Is_revolve(arr3, arr2);
if(ret == 1)
{
printf ("arr1是arr2旋转得到的!!!\n");
}
else
{
printf ("arr1不是arr2通过旋转得到的\n");
}
system ("pause");
return 0;
}