- 实现一个函数,可以左旋字符串中的k个字符。
ABCD左旋一个字符得到BCDA
ABCD左旋两个字符得到CDAB
思路
将首位字符先存起来,将除最后一位字符以外的字符都向前移一位,最后将首位字符存到数组末尾,循环k次即可
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
void Left_string(char arr[], int k,int len)
{
int i = 0;
int j = 0;
//左旋k个字符则循环k次
for (i = 0; i < k; i++)
{
//将第一位字符存起来
char tmp = arr[0];
//将后一位的值赋给前一位
for (j = 0; j < len - 1; j++)
{
arr[j] = arr[j + 1];
}
//将第一位的字符赋予最有一位
arr[len - 1] = tmp;
}
//打印字符串
for (i = 0; i < len; i++)
{
printf("%c ", arr[i]);
}
}
int main()
{
char arr[4] = "ABCD";
int len = sizeof(arr) / sizeof(arr[0]);
int k = 0;
scanf("%d", &k);
Left_string(arr, k, len);
system("pause");
return 0;
}
- 判断一个字符串是否为另外一个字符串旋转之后的字符串。
例如:给定s1 =AABCD和s2 = BCDAA,返回1,给定s1=abcd和s2=ACBD,返回0.
AABCD左旋一个字符得到ABCDA
AABCD左旋两个字符得到BCDAA
AABCD右旋一个字符得到DAABC
思路
在第一题的基础上加一个比较字符串即可
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <string.h>
int estimate(char arr[], char arr2[], int len)
{
int i = 0;
int j = 0;
for (i = 0; i < len; i++)
{
char tmp = arr[0];
//比较字符串,若相等则结束函数,饭后左旋次数
if (memcmp(arr, arr2,len) == 0)
{
return i;
}
//左旋字符串
for (j = 0; j < len - 1; j++)
{
arr[j] = arr[j + 1];
}
arr[len - 1] = tmp;
}
//不相等则返回-1
return -1;
}
int main()
{
char arr[7] = "ABCDEFG";
int len = sizeof(arr) / sizeof(arr[0]);
char arr2[7] = { 0 };
printf("输入需要判断的字符串:\n");
for (int i = 0; i < len; i++)
{
scanf("%c", &arr2[i]);
}
int ret = 0;
ret = estimate(arr, arr2, len);
//输出结果
if (ret >= 0)
{
printf("左旋%d个字符串得到\n", ret);
}
else
{
printf("不是另外一个字符串ABCD旋转之后的字符串\n");
}
system("pause");
return 0;
}