目录
题目:
实现一个函数,可以左旋字符串中的k个字符。
例如:
ABCD左旋一个字符得到BCDA
ABCD左旋两个字符得到CDAB
解析:该题有两种解决方法(我能想到的)。
- #include
- #include
- //第一个方法:暴力旋转,也就是枚举。
- //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;
- }
运行结果如下:
题目:
写一个函数,判断一个字符串是否为另外一个字符串旋转之后的字符串。
例如:给定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;
- }
运行结果如下: