问题描述:
实现一个函数,可以左旋字符串中的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;
}