1.题目:
1..先来看一道相对简单的:
实现一个函数,可以左旋字符串中的k个字符。
例如:
ABCD左旋一个字符得到BCDA
ABCD左旋两个字符得到CDAB
写一个函数,判断一个字符串是否为另外一个字符串旋转之后的字符串。
1.第一种简单的方法:
void left(char* arr, int str, int k)
{
int i;
int t=k%str;
while (t--)
{
char temp = *arr;
for (i = 0; i < str-1; i++)
{
arr[i] = arr[i + 1];
}
arr[i] = temp;
}
}
int main()
{
int k;
scanf("%d", &k);
char arr[] = { "ABCD" };
int str = strlen(arr);
left(arr, str, k);
printf("%s", arr);
return 0;
}
2.第二种方法:
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
void left(char* arr, int str, int k)
{
char tmp[365] = { 0 };
int t = k % str;
strcpy(tmp, arr + t);
strncat(tmp, arr ,str-t);
strcpy(arr, tmp);
}
int main()
{
int k;
scanf("%d", &k);
char arr[] = { "ABCD" };
int str = strlen(arr);
left(arr, str, k);
printf("%s", arr);
return 0;
}
3.第三种方法:
先将要左旋的前三个家伙逆序(CBADEFG),然后将后半段也逆序(CBAGFED),最后整体逆序(DEFGABC)即可。这样只需要做数值交换即可,可以写一个函数帮我们完成局部逆序,代码如下:
void reverse_part(char *str, int start, int end) //将字符串从start到end这一段逆序
{
int i, j;
char tmp;
for (i = start, j = end; i < j; i++, j--)
{
tmp = str[i];
str[i] = str[j];
str[j] = tmp;
}
}
void leftRound(char * src, int time)
{
int len = strlen(src);
int pos = time % len;
reverse_part(src, 0, pos - 1); //逆序前段
reverse_part(src, pos, len - 1); //逆序后段
reverse_part(src, 0, len - 1); //整体逆序
}
2.写一个函数,判断一个字符串是否为另外一个字符串旋转之后的字符串。
例如:给定s1 =AABCD和s2 = BCDAA,返回1
给定s1=abcd和s2=ACBD,返回0.
AABCD左旋一个字符得到ABCDA
AABCD左旋两个字符得到BCDAA
AABCD右旋一个字符得到DAABC
1.第一种方法:
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<string.h>
int left(char* arr, char *arr2,int str)
{
int i=0,a=str;
char temp=0;
while(str--)
{
temp = *(arr + i);
for (i = 0; i < a-1; i++)
{
arr[i] = arr[i + 1];
}
arr[i] = temp;
if (strcmp(arr, arr2) == 0)
{
return 1;
}
}
return 0;
int main()
{
char arr1[] = { "ABCD" }, arr2[] = { "BCDA" };
int str = strlen(arr1);
int ret=left(arr1,arr2, str);
if (ret == 1)
{
printf("是旋转后的结果");
}
return 0;
}
2.第二种方法:
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
int left(char* arr, int str, char*arr1)
{
char tmp[365] = { 0 };
strcpy(tmp, arr );
strncat(tmp, arr );
return strstr(tmp, arr1) != NULL;
}
int main()
{
char arr[] = { "ABCD" };
char arr1[] = { "BCDA" };
int str = strlen(arr);
int ret=left(arr, str, arr1);
if (ret == 1)
{
printf("是旋转后的结果");
}
else
{
printf("不是旋转后的结果");
}
return 0;
}
3.第三种方法:
void reverse_part(char* str, int start, int end) //将字符串从start到end这一段逆序
{
int i, j;
char tmp;
for (i = start, j = end; i < j; i++, j--)
{
tmp = str[i];
str[i] = str[j];
str[j] = tmp;
}
}
int leftRound(char* src,char*src1)
{
int len = strlen(src);
int ret = 0;
for(int pos=0;pos<len;pos++)
{
reverse_part(src, 0, pos - 1); //逆序前段
reverse_part(src, pos, len - 1); //逆序后段
reverse_part(src, 0, len - 1); //整体逆序
ret = strcmp(src, src1);
if (ret == 0)
{
break;
}
}
return ret;
}
int main()
{
char arr[] = { "ABCD" };
char arr1[] = { "BCDA" };
int str = strlen(arr);
int ret=leftRound(arr, arr1);
if (ret == 0)
{
printf("是旋转后的结果");
}
else
{
printf("不是旋转后的结果");
}
return 0;
}
2.总结:
以上就是雯雯在学习过程中get到的几种方法,大家也好好学习哦!