1.实现一个函数,可以左旋字符串中的k个字符。
ABCD左旋一个字符得到BCDA
ABCD左旋两个字符得到CDAB
思路:获取要旋转的数字k,先将整个字符串倒置,然后翻转后k个字符的顺序,再翻转剩下的字符.这样就可以得到字符串左旋k个字符的结果,并且保证顺序不出错
代码实现:
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
void Rotate(char* start, char* end){
int count = 0;
while (start < end){
*start = *start^*end;
*end = *start^*end;
*start = *start^*end;
++start;
--end;
count++;
}
}
int main(){
char arr[] = "ABCD";
int len=strlen(arr)-1;
int k = 0;
printf("请输入k的值:");
scanf("%d", &k);
Rotate(arr, arr+len);//翻转整个字符串
Rotate(arr, arr + len-k);//翻转不需要左旋的字符
Rotate(arr+len-k+1, arr + len);//调整左旋的字符顺序
printf("左旋后的字符串为:");
printf("%s\n", arr);
return 0;
}
2.判断一个字符串是否为另外一个字符串旋转之后的字符串。 例如:给定s1 =AABCD和s2 = BCDAA,返回1,给定s1=abcd和s2=ACBD,返回0.
AABCD左旋一个字符得到ABCDA AABCD左旋两个字符得到BCDAA
AABCD右旋一个字符得到DAABC
分别判断两个字符串长度,若两个字符串长度不相等直接返回0.若长度相等,可以利用上一题反向思路,将其中一个字符串左旋一个字符,每左旋一次,判断一次.判断次数最多为"字符串长度"次,若判断次数用完两个字符串仍不相等则返回0,若其中遇到相等的情况,返回1.
代码实现:
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include<string.h>
#define MAX 100
void Rotate(char* start, char* end){
while (start < end){
*start = *start ^ *end;
*end = *start ^ *end;
*start = *start ^ *end;
++start;
--end;
}
}
void left_rotate(char* str,int k){
int len=strlen(str);
Rotate(str,str+len-1);
//旋转所有字符
Rotate(str,str+len-1-k);
//翻转所有无需旋转的字符
}
int is_rotate(char* s1,char*s2) {
if (strlen(s1)!=strlen(s2)) {
return 0;
//判断两个字符串的长度,若不相等则直接返回0;
}
if (0==strcmp(s1, s2)) {
return 1;
}
int k = strlen(s1);
while (k>0) {
left_rotate(s1, 1);
if (0==strcmp(s1, s2)) {
return 1;
}
k--;
}
return 0;
}
int main(){
char s1[MAX] = { 0 };
char s2[MAX] = { 0 };
printf("请输入第一组字符串(5个字符):");
scanf("%s", &s1);
printf("请输入第二组字符串(5个字符):");
scanf("%s", &s2);
printf("%d\n",is_rotate(s1,s2));
return 0;
}