1.字符串左旋
实现一个函数,可以左旋字符串中的k个字符。
例如:
ABCD左旋一个字符得到BCDA
ABCD左旋两个字符得到CDAB
分析:我们先考虑左旋一个字符然后进行for循环满足题目要求的左旋次数,先将字符‘A’保存起来,然后将'BCD‘依次向前移,最后再将’A‘放进最后一位即可满足条件,下面我们进行操作.
代码如下:
void my_leftmove(char* arr, int m) { int len = strlen(arr); int i,j; for (i = 0; i < m; i++) { //旋转一个字符 //1.将第一个字符存起来 char p = *arr; //2.将后面的字符依次往前移 for (j = 0; j < len - 1; j++){ *(arr + j) = *(arr + j + 1); } //3.把保存的字符放在最后一位 *(arr + len - 1) = p; } } int main() { char arr[] = "ABCD"; int k; scanf("%d", &k); my_leftmove(arr, k); printf("%s", arr); return 0; }
2.
字符串旋转结果
写一个函数,判断一个字符串是否为另外一个字符串旋转之后的字符串。
例如:给定s1 =AABCD和s2 = BCDAA,返回1
给定s1=abcd和s2=ACBD,返回0.
AABCD左旋一个字符得到ABCDA
AABCD左旋两个字符得到BCDAA
AABCD右旋一个字符得到DAABC
代码1如下:
#include<stdio.h> void my_leftmove(char* arr, int m) { int len = strlen(arr); int i,j; for (i = 0; i < m; i++) { //旋转一个字符 //1.将第一个字符存起来 char p = *arr; //2.将后面的字符依次往前移 for (j = 0; j < len - 1; j++){ *(arr + j) = *(arr + j + 1); } //3.把保存的字符放在最后一位 *(arr + len - 1) = p; } } int is_moveleft(char a1[], char a2[]) { int len1= strlen(a1); int len2 = strlen(a2); //先判断字符串长度是否相等,不相等则直接返回; if (len1 != len2) { return 0; } int i=0; for (i = 0; i < len1; i++) { //字符串左移 my_leftmove(a1, 1); //比较俩个数组是否相等; if (strcmp(a1, a2) == 0) { return 1; } } return 0; } int main() { char a1[] = "ABCDE"; char a2[] = "BCD"; int ret = is_moveleft(a1,a2); if (ret == 1) { printf("YES\n"); } else { printf("NO\n"); } return 0; }
代码2如下:
#include<stdio.h> #include<assert.h> #include<assert.h> int is_moveleft(char a1[], char a2[]) { //判断是否为空 assert(a1); assert(a2); int len1 = strlen(a1); int len2 = strlen(a2); if (len1 != len2) { return 0; } int i = 0; //给a1后面追加一个a1的字符串 strncat(a1, a1, len1); //判断a2是否是a1的字符串 if (NULL == strstr(a1, a2)) { return 0; } else { return 1; } } int main() { char a1[] = "ABCDE"; char a2[] = "BCDEA"; int ret = is_moveleft(a1,a2); if (ret == 1) { printf("YES\n"); } else { printf("NO\n"); } return 0; }