网站外链建设是什么,小程序商城开发公司哪个好,wordpress 前台空白,建设网站需要服务器C语言–字符串旋转笔试题 文章目录 C语言--字符串旋转笔试题一、字符串左旋1.1 思路11.2 思路1代码1.3 思路21.4 思路2代码 二、字符串旋转结果判断2.1 思路12.2 思路2 一、字符串左旋
实现一个函数#xff0c;可以左旋字符串中的k个字符。
例如#xff1a;
ABCD左旋一个字…C语言–字符串旋转笔试题 文章目录 C语言--字符串旋转笔试题一、字符串左旋1.1 思路11.2 思路1代码1.3 思路21.4 思路2代码 二、字符串旋转结果判断2.1 思路12.2 思路2 一、字符串左旋
实现一个函数可以左旋字符串中的k个字符。
例如
ABCD左旋一个字符得到BCDA
ABCD左旋两个字符得到CDAB
1.1 思路1
先把第一个元素取出来暂时存放在变量中后面的整体移动到前面然后把第一个变量存放在最后的位置循环往复。
1.2 思路1代码
#define _CRT_SECURE_NO_WARNINGS 1
#include stdio.h
#includestring.h
void left_move(char arr[], int k)
{int i 0;int len strlen(arr);for (i 0; i k; i){//先保存首元素char tmp arr[0];//将后面的值放到前面int j 0;for (j 0; j len - 1; j){arr[j] arr[j 1];}//将首元素放到最后arr[len - 1] tmp;}
}
int main()
{char arr[] abcdefg;int k 2;left_move(arr,k);printf(%s, arr);return 0;
}1.3 思路2
逆序法 ABCD 例如我要左旋2个字符首先先将AB逆序变成BA然后再将CD逆序变成DC此时就是BADC然后将整体逆序变成CDBA
1.4 思路2代码
#define _CRT_SECURE_NO_WARNINGS 1
#include stdio.h
#includestring.h
#includeassert.h
//逆序函数
void reverse(char* left, char* right)
{assert(left);assert(right);while (left right){char tmp *left;*left *right;*right tmp;left;right--;}}
void left_move(char arr[], int k)
{int i 0;int len strlen(arr);//逆序左边reverse(arr, arr k - 1);//逆序右边reverse(arr k, arr len - 1);//逆序整体reverse(arr, arr len - 1);
}
int main()
{char arr[] abcdefg;int k 2;left_move(arr,k);printf(%s, arr);return 0;
}二、字符串旋转结果判断
写一个函数判断一个字符串是否为另外一个字符串旋转之后的字符串。
例如给定s1 AABCD和s2 BCDAA返回1
给定s1abcd和s2ACBD返回0.
AABCD左旋一个字符得到ABCDA
AABCD左旋两个字符得到BCDAA
AABCD右旋一个字符得到DAABC
2.1 思路1
依赖于上面写过的旋转函数将字符串旋转之后看两个字符串是否相同来判断
#define _CRT_SECURE_NO_WARNINGS 1
#includestdio.h
#includestring.h
#includeassert.hvoid reverse(char* left, char* right)
{assert(left);assert(right);while (left right){char tmp *left;*left *right;*right tmp;left;right--;}}
void left_move(char arr[], int k)
{int i 0;int len strlen(arr);//逆序左边reverse(arr, arr k - 1);//逆序右边reverse(arr k, arr len - 1);//逆序整体reverse(arr, arr len - 1);
}
int is_left_move(char arr1[], char arr2[])
{int len1 strlen(arr1);int len2 strlen(arr2);if (len1 ! len2)//如果两个字符串长度不相同一定不是旋转得来的{return 0;}int i 0;for (i 0; i len1; i){left_move(arr1, 1);//每次旋转一个然后判断是否相等if (strcmp(arr1, arr2) 0)//如果出现小写字母在这里就会发现{return 1;}}return 0;
}
int main()
{char arr1[] AABCD;char arr2[] BCDAA;int ret is_left_move(arr1, arr2);if (ret 1){printf(YES\n);}else{printf(NO\n);}return 0;}2.2 思路2
AABCD 如果在后面再加上一组 AABCD 得出 AABCDAABCD那么就会得到AABCD所有旋转之后的结果在和另一个字符串比较的时候只需要判断其是不是AABCDAABCD的字串就可以了前提还是这两个字符串长度相等的情况下
#define _CRT_SECURE_NO_WARNINGS 1
#includestdio.h
#includestring.hint is_left_move(char arr1[], char arr2[])
{int len1 strlen(arr1);int len2 strlen(arr2);if (len1 ! len2)//如果两个字符串长度不相同一定不是旋转得来的{return 0;}strncat(arr1, arr1, len1);//字符串追加函数len1表示追加的个数if (strstr(arr1, arr2) ! NULL)//strstr是在arr1字符串中查找arr2是否存在//如果存在则返回arr2在arr1中第一次出现的地址//如果不存在则返回NULL{return 1;}else{return 0;}}
int main()
{char arr1[20] AABCD;char arr2[] BCDAA;int ret is_left_move(arr1, arr2);if (ret 1){printf(YES\n);}else{printf(NO\n);}return 0;}