1. 字符串的左旋
题目:
实现一个函数,可以左旋字符串中的k个字符。
例如:
ABCD左旋一个字符得到BCDA
ABCD左旋两个字符得到CDAB
解析:该题有两种解决方法(我能想到的)。
- 第一种:直接暴力解法
#include<stdio.h> #include<string.h> //第一个方法:暴力旋转,也就是枚举。 //a是传进来的数组首元素地址,k是要左旋的个数 void leftMoveStrOne(char* a, int k) { //先计算该数组有多长 size_t len = strlen(a); //如果k是大于len,说明k旋转了一周或者n周,所以要取模 k = k % len; for (int i = 0;i < k;i++) { //将第一个数组元素保存起来 int tmp = a[0]; size_t j = 0; //这里为什么需要len - 1呢,因为怕越界了 //例如:有5个元素,下标最多到4,而j + 1可能会到5,所以越界了! for (j = 0;j < len - 1;j++) { a[j] = a[j + 1]; } a[len - 1] = tmp; } } int main() { char str[]= "ABCDE"; leftMoveArrOne(str, 2); printf("%s", str); return 0; /*char str[]= "ABCDE"; leftMoveStrTow(str, 2); printf("%s", str);*/ return 0; }
运行结果如下:
- 第二种:三步翻转法,也叫三步逆序法。
//第二种方法:三步翻转法,也叫三步逆序法。 //先写一个逆序的方法 void reverse(char* left, char* right) { while (left < right) { char tmp = *left; *left = *right; *right = tmp; left++; right--; } } void leftMoveStrTow(char* str, int k) { size_t len = strlen(str); k = k % len; reverse(str, str + k - 1);//第一次翻转 reverse(str + k, str + len - 1);//第二次翻转 reverse(str, str + len - 1);//第三次翻转 } int main() { char str[]= "ABCDE"; leftMoveStrTow(str, 2); printf("%s", str); return 0; }
运行结果如下:
2. 判断一个字符串是否为另外一个字符串旋转之后的字符串
题目:
写一个函数,判断一个字符串是否为另外一个字符串旋转之后的字符串。
例如:给定s1 =AABCD和s2 = BCDAA,返回1
给定s1=abcd和s2=ACBD,返回0.
AABCD左旋一个字符得到ABCDA
AABCD左旋两个字符得到BCDAA
AABCD右旋一个字符得到DAABC
解析:该题有两种解决方法(我能想到的)。
- 第一种:直接暴力解法
不断地左旋,得到一个新的字符,然后去判断两个字符串是不是相等!
//第一种方法:暴力破解法,枚举 //s1是要匹配的字符串,s2是去匹配s1的字符串 int isLeftMove(char* s1, char* s2) { size_t lens1 = strlen(s1); size_t lens2 = strlen(s2); if (lens1 != lens2) { return 0; } size_t i = 0; for (i = 0;i < lens1;i++) { char tmp = s2[0]; size_t j = 0; for (j = 0;j < lens1 - 1;j++) { s2[j] = s2[j + 1]; } s2[lens1 - 1] = tmp; if (strcmp(s1, s2) == 0) { return 1; } } return 0; } int main() { char s1[20] = "abcde"; char s2[] = "bcdea"; int flag = isLeftMove(s1, s2); printf("%d", flag); return 0; }
运行结果如下:
- 第二种:拼接比较法
//第二种方法:拼接比较法 int isLeftMovePlus(char* s1, char* s2) { size_t lens1 = strlen(s1); size_t lens2 = strlen(s2); if (lens1 != lens2) return 0; char* start = strncat(s1, s1, lens1); //用strstr()函数判断s2是不是s1的子串 if (strstr(start, s2) == NULL) return 0; else return 1; } int main() { char s1[20] = "abcde"; char s2[] = "bcdea"; int flag = isLeftMove(s1, s2); printf("%d", flag); return 0; }
运行结果如下: