问题描述:
实现一个函数,可以左旋字符串中的k个字符。 例如:ABCD左旋一个字符得到BCDA ABCD左旋两个字符得到CDAB
第一种方法:
暴力求解法:利用while循环,不断将第一个字符后移,直到第k个字符
代码如下:
#include<stdio.h> #include<assert.h> void left_move(int k, char* arr) { assert(arr); int len = strlen(arr); 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() { char arr[] = "abcdefgh"; int k = 0; scanf("%d", &k); left_move(k, arr); printf("%s\n", arr); return 0; }
第二种方法:
三步翻转法:我们可以先将前k个字符逆序,然后再将后面字符逆序,最后将整体逆序。
代码如下:
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(int k, char* arr) { assert(arr); int len = strlen(arr); assert(k <= len); reverse(arr, arr + k - 1);//逆序左边 reverse(arr + k, arr + len - 1);//逆序右边 reverse(arr, arr + len - 1);//整体逆序 } int main() { char arr[] = "abcdefgh"; int k = 0; scanf("%d", &k); left_move(k, arr); printf("%s\n", arr); return 0; }