目录
1.题目描述 一
2.解题想法图解
2.1直接解
2.2巧解
3.题目描述二
3.1.1思路1
3.1.2 思路2
4.结语
1.题目描述 一
实现现一个函数,可以左旋字符串中的k个字符。
例如:
ABCD左旋一个字符得到BCDA
ABCD左旋两个字符得到CDAB
2.解题想法图解
2.1直接解
当我们要进行多次反转只用循环执行上述过程就行了
我们来看一下解答代码:
void left_reverse(char* str, int k)
{int sz = strlen(str);while (k){char temp = *str;int i = 0;for (i = 0; i < sz - 1; i++){*(str+i) = *(str +i+ 1);}*(str + sz - 1) = temp;k--;}}
int main()
{char arr[] = "ABCD";int k = 0;printf("请输入要旋转的次数:\n");scanf("%d", &k);left_reverse(arr, k);printf("%s\n", arr);return 0;
}
2.2巧解
根据上图,我们不难总结出这样的规律:
字符串左旋一次的结果就是将字符串第一个字符进行翻转然后剩余的字符在进行逆序,最后整体逆序
字符串左旋两次的结果就是将字符串前两个字符进行逆序,然剩下的字符串再逆序,最后整体逆序就可以得到。
我们来看一下实现代码;
void reverse(char* left, char* right)
{assert(left && right);//涉及到解引用断言一下while (left < right){char temp = *left;*left = *right;*right = temp;left++;right--;}
}
void left_reverse(char* str, int k)
{int len = strlen(str);//为了实现逆序//先实现左边逆序reverse(str, str + k - 1);//右边逆序reverse(str + k, str + len - 1);//整体逆序reverse(str, str + len - 1);
}int main()
{char arr[] = "ABCD";int k = 0;printf("请输入要旋转的次数:\n");scanf("%d", &k);left_reverse(arr, k);printf("%s\n", arr);return 0;
}
3.题目描述二
写一个函数,判断一个字符串是否为另外一个字符串旋转之后的字符串。
例如:给定s1 =AABCD和s2 = BCDAA,返回1
给定s1=abcd和s2=ACBD,返回0.
AABCD左旋一个字符得到ABCDA
AABCD左旋两个字符得到BCDAA
AABCD右旋一个字符得到DAABC
3.1.1思路1
我们直接将其中一个字符串进行左旋,每次旋转后都与宁外一个字符串进行比较,看是否相等。我们旋转的次数选择应该和我们选择进行左旋的字符串的长度相等,因为要保证每一次的左旋结果都没有漏掉。
int is_left_move(char* str1, char* str2)
{int sz = strlen(str1);int k = sz-1;while (k){char temp = *str1;int i = 0;for (i = 0; i < sz - 1; i++){*(str1+i) = *(str1 +i+ 1);}*(str1 + sz - 1) = temp;if (strcmp(str1, str2) == 0)return 1;k--;}return 0;
}int main()
{char arr1[] = "abcdef";char arr2[] = "cdefab";int ret = is_left_move(arr1, arr2);if (ret == 1){printf("YES\n");}else{printf("NO\n");}return 0;
}
3.1.2 思路2
看一下代码实现:
int is_left_move(char* str1, char* str2)
{int len1 = strlen(str1);int len2 = strlen(str2);if (len1 != len2)return 0;strncat(str1, str1, len1);if (strstr(str1, str2) == NULL)return 0;elsereturn 1;
}int main()
{char arr1[] = "abcdef";char arr2[] = "cdefab";int ret = is_left_move(arr1, arr2);if (ret == 1){printf("YES\n");}else{printf("NO\n");}return 0;
}
4.结语
以上就是本期的所有内容,知识含量蛮多,大家可以配合解释和原码运行理解。创作不易,大家如果觉得还可以的话,欢迎大家三连,有问题的地方欢迎大家指正,一起交流学习,一起成长,我是Nicn,正在c++方向前行的奋斗者,感谢大家的关注与喜欢。