1.实现一个函数,可以左旋字符串中的k个字符。
ABCD左旋一个字符得到BCDA
ABCD左旋两个字符得到CDAB
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<string.h>
#include<windows.h>
void revolve( char arr[],int n,int sz)
{
int i = 0;
int j = 0;
for (i = 0;i < n;i++)
{
arr[sz+i] = arr[i];
}
for (j = i ;j <= sz+i ;j++)
{
arr[j-i] = arr[j];
}
}
int main()
{
//实现一个函数,可以左旋字符串中的k个字符。
// ABCD左旋一个字符得到BCDA
// ABCD左旋两个字符得到CDAB
char arr[50] = "abcd";
int sz = strlen(arr);
int n = 0;
printf("请输入你要左旋字符的长度:\n");
scanf("%d", &n);
revolve(arr,n,sz);
for (n = 0;n < sz;n++)
{
printf("%c", arr[n]);
}
system("pause");
return 0;
}
2.判断一个字符串是否为另外一个字符串旋转之后的字符串。
例如:给定s1 = AABCD和s2 = BCDAA,返回1,给定s1=abcd和s2=ACBD,返回0.
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
//len可不由参数传递,可在Left函数内求得
//void Left(char c[], int len, int k)//方法1
//{
// k = k%len;//对于5个字符的字符串,左旋3次和左旋8次结果一样
// int j = 0;
// for (j=0; j<k; j++)
// {
// int i = 0;
// char tmp = c[0];
// for (i=0; i<len-1; i++)
// {
// c[i] = c[i+1];
// }
// c[i] = tmp;
// }
//}
//void Reverse(char *start, char *end)
//{
// while (start<end)
// {
// *start ^= *end;
// *end ^= *start;
// *start ^= *end;
// start++;
// end--;
// }
//}
//
//void Left(char c[], int len , int k)
//{
// k = k%len;
// Reverse(c, c+k-1);
// Reverse(c+k, c+len-1);
// Reverse(c, c+len-1);
//}
void Left(char c[], int len , int k)
{
k = k%len;
char *p = (char *)malloc((2*len+1)*sizeof(char));
strcpy(p, c);
strcat(p, c);
strncpy(c, p+k, len);
free(p);
}
int main()
{
char c[] = "ABCDE";
int k = 2;
int len = strlen(c);
printf("左旋前:%s\n", c);
Left(c,len,k);
printf("左旋后:%s\n", c);
return 0;
}