题目描述:
实现一个函数,可以左旋字符串中的k个字符。
示例:
ABCD左旋一个字符得到BCDA
ABCD左旋两个字符得到CDAB
思绪一:
- 反转前k个字符串
- 反转剩下的字符串
- 再整体反转(这样就是左旋k个字符串)
思绪二:
- 再创建一个存储数组
- 从字符串第k+1个开始往后的字符赋给存储数组
- 再将前k个字符拼接到存储数组中
- 将存储数组赋回原数组
代码如下:
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#if 1 //将 1 改为 0,执行思绪二!
//字符串反转函数
void reverse_part(char *src, int start, int end){
int i, j;
char tmp;
for (i = start, j = end; i < j; i++, j--){
tmp = src[i];
src[i] = src[j];
src[j] = tmp;
}
}
//左旋函数
void round(char * src, int time){
int len = strlen(src);
int pos = time%len;//反转一个字符串的长度等于没有反转(防止输入的数大于字符串长度)
reverse_part(src, 0, pos - 1);//反转前n个字符串
reverse_part(src, pos, len - 1);//反转剩下的字符串
reverse_part(src, 0, len - 1);//整体反转
}
#else
//左旋函数
void round(char * src, int time){
char tmp[256] = { 0 };
int len = strlen(src);
int pos = time % len;//防止输入的数大于数组个数
strcpy(tmp, src + pos);//从src[pos]开始的数组赋给tmp数组中
strncat(tmp, src, pos);//将src的前pos个字符拼接到tmp数组后
strcpy(src, tmp);//将tmp数组赋回src数组中
}
#endif
int main(){
int input;
char str[] = "ABCDE";
printf("请输入左旋的个数:");
scanf("%d", &input);
round(str, input);
puts(str);
system("pause");
return 0;
}
代码生成图:
题目描述:
实现一个函数,可以右旋字符串中的k个字符。
思绪
- 只需右旋k次,相当于左旋(str长度 - k)次。
- 字符串ABCD右旋1次:DABC
- 相当于其左旋3次:DABC
所以如果要通过左旋函数完成右旋,需要知道字符串的长度。
题目描述:
判断一个字符串是否为另外一个字符串旋转之后的字符串
示例:
给定s1 =AABCD和s2 = BCDAA,返回1
给定s1=abcd和s2=ACBD,返回0.
AABCD左旋一个字符得到ABCDA
AABCD左旋两个字符得到BCDAA
AABCD右旋一个字符得到DAABC
思绪:
- 将原数组写两遍到存储数组中(这样无论是左旋还是右旋都可以找到)
- 存储数组查找另外一个字符串(如果存在返回1,不存在返回0)
代码如下:
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<string.h>
int find_round(char * src, char * find){
char tmp[256] = { 0 };
strcpy(tmp, src);
strcat(tmp, src);
return strstr(tmp, find) ? 1 : 0;//在tmp里面找find
}
int main1(){
printf("%d\n", find_round("ABCDE", "BCDEA"));
return 0;
}