之前看到过一个很有意思的一个题目,和大家分享一下。
题目是这样的,实现一个函数,要求是左旋字符串的k个字符
这里我想到了两种简单的方法
第一种方法是每次旋转一个字符,把这个动作执行k次
首先创建一个字符串(随机)为 char arr[]="abcdefghi";
这里先以k=1为例;
上图
完整代码如下:
void left_move(char arr[], int k) { //每一次只旋转一个字符,把这个动作执行K次 int i = 0; int len = strlen(arr); k %= len; for (i = 0; i < k; i++) { //1 char tmp = arr[0]; //2 把后边的字符全部往前挪动一个位置 int j = 0; for (j = 0; j < len - 1; j++) { arr[j] = arr[j + 1]; } //3 arr[len - 1] = tmp; } } int main() { char arr[] = "abcdefghi"; int k = 0; scanf("%d", &k); left_move(arr, k); printf("%s\n", arr); return 0; }
这里的k%=len;是怕给定的k值太大
第二种方法是散步翻转法
上图
完整代码如下:
void reverse(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) { //每一次只旋转一个字符,把这个动作执行K次 int i = 0; int len = strlen(arr); k %= len; reverse(arr, arr+k-1); reverse(arr+k, arr + len - 1); reverse(arr, arr + len - 1); } int main() { char arr[] = "abcdefghi"; int k = 0; scanf("%d", &k); left_move(arr, k); printf("%s\n", arr); return 0; }
这个如果看不懂,可以结合图看一下。