使用多种方法实现字符串左旋转
一、 左移法
思路:每一次通过移动第一个字符,然后把后面的字符前移,然后再进行移动第一个字符再前移。故需要使用嵌套循环,外层循环控制移动第一个字符的次数,第二个循环进行字符前移
代码如下:
#define _CRT_SECURE_NO_WARNINGS #include <stdio.h> #include <string.h> #include <assert.h> void left_move(char* arr, int k) { assert(arr);//断言引用头文件 <assert.h> int len = strlen(arr);//注意引头文件 <string.h> for (int i = 0; i < k; i++) { char tmp = *arr;//使用临时值接收第一个字符 for (int j = 0; j < len - 1; j++)//前移 { *(arr + j) = *(arr + j + 1); } *(arr + len - 1) = tmp;//把最后一个字符放回最后一个数组位置 } } int main() { int k = 0; char arr[30] = "ABCD"; printf("请输入要左旋转字符的个数k:"); scanf("%d",&k); left_move(arr, k); printf("%s", arr); return 0; }
二、分步逆序法
思路:先使用一个移动函数,把前k个字符反转,再移动k后面字符反转。最后整体反转。即数组ABCD k为2,1.BA->2.DC->3DCBA。
代码如下:
#define _CRT_SECURE_NO_WARNINGS #include <stdio.h> #include <string.h> #include <assert.h> void reserve(char* left,char* right)//初始位置 旋转位置 { assert(left && right); while (left < right)//循环进行交换字符 { char tmp = *left; *left = *right; *right = tmp; left++; right--; } } void left_move(char* arr, int k) { int len = strlen(arr); reserve(arr,arr+k-1); reserve(arr+k, arr+len-1); reserve(arr,arr+len-1); } int main() { int k = 0; char arr[30] = "ABCD"; printf("请输入要左旋转字符的个数k:"); scanf("%d",&k); left_move(arr, k); printf("%s", arr); return 0; }
三、函数法
思路:使用strncat把数组arr复制一份并放在arr数组中。通过循环直接获取对应位置字符串方法arr2即可。
#define _CRT_SECURE_NO_WARNINGS #include <stdio.h> #include <string.h> #include <assert.h> void left_move(char* arr, char* arr2, int k) { int len = strlen(arr); strncat(arr, arr, len);//ABCD->ABCDABCD for (int i = 0; i < len; i++) { arr2[i] = *(arr + k + i);//获取k + i个字符 } } int main(void) { int k = 0; char arr[30] = "ABCD"; char arr2[30] = { '\0'}; printf("请输入要左旋转字符的个数k:"); scanf("%d", &k); left_move(arr,arr2,k); printf("%s", arr2); return 0; }