题目描述:
实现一个函数,可以左旋字符串中的k个字符。
例如:
ABCD左旋一个字符得到BCDA
ABCD左旋两个字符得到CDAB
思路1:
先将第一个字符赋给tmp保存,再将后面的字符依次前移,最后再把保存到字符添加至末尾
![](https://img-blog.csdnimg.cn/img_convert/521869d58e58a21978f1341a17a6ca41.png)
要左旋k个字符,就重复上述步骤k次
思路2:
新建一个字符数组,将k之后数组和之前数据分别拷贝至新的字符数组,最后再将新的字符数组拷贝至arr数组。
![](https://img-blog.csdnimg.cn/img_convert/0b5e9925d25c02b2812d651152d1ad41.png)
可以发现上述两种思路要不是时间复杂度比较高就是空间复杂度比较高,为了提升效率我们想到更优的思路
思路3:
将k之前元素与之后元素分别逆置,再整体逆置
![](https://img-blog.csdnimg.cn/img_convert/4db91474d48525bbbca80b82d221955c.png)
最终代码实现:
#include<assert.h>
void reverse(char* left, char* right)
{
assert(left);
assert(right);
//断言处理判断left和right是否为空,为空退出程序
while (left < right)
{
char tmp = *left;
*left = *right;
*right = tmp;
left++;
right--;
}
}
int main()
{
char arr1[] = "helloworld";
int k = 0;
int len = strlen(arr1);
scanf("%d", &k);
k = k % len;
reverse(arr1, &arr1[k - 1]);
reverse(&arr1[k], &arr1[len - 1]);
reverse(arr1, &arr1[len - 1]);
printf("%s\n", arr1);
return 0;
}