字符串左旋
实现一个函数,可以左旋字符串中的k个字符。
例如
ABCD左旋一个字符得到BCDA
ABCD左旋两个字符得到CDAB
思路:
首先将左旋的思路清楚,这里用画图表示
需要注意的是:每次移动一个字符,剩下的元素都要往前走一个位置,也就是下标-1
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<string.h>
void left_remove(char *arr1,int k)
{
//左移多少个就遍历多少个
size_t len = strlen(arr1);
for (int i = 0; i < k; i++)
{
//左移操作符前需要将第一个字符找个临时变量存储起来
char temp = 0;
temp = arr1[0];
//后面将所有的字符都往前移动一个元素的位置
for (int j =0;j<len-1;j++)
{
arr1[j] = arr1[j + 1];
}
arr1[len - 1] = temp;
}
}
int main()
{
char arr1[20] = "abcdef";
int k = 0;
scanf("%d",&k);
//用户输入需要左移多少个字符串
left_remove(arr1,k);
printf("%s",arr1);
return 0;
}
其实到这里这个题目也就解决完了,但是考虑到代码效率来说,需要从左往右遍历的时间复杂度是O(n),其实计算的时间是比较久的
因此有了第二套优化方法
这里是另外一种思路,将要左移n个元素,就先逆序前n个元素,然后整个字符串长度-n的元素个数进行逆序,最后再将整个字符串逆序,
例如:abcedf 左移两个元素->ba cedf -> ba fdec ->cedfab
这样的代码效率也能更高,时间复杂度远远小于O(n)
代码演示
void my_reverse(char* left, char* right)
{
while (left < right)
{
char temp = *left;
*left = *right;
*right = temp;
left++;
right--;
}
}
void left_remove(char *arr,int k)
{
int len =strlen(arr);
my_reverse(arr,arr+k-1);//字符串前k个逆序
my_reverse(arr+k,arr+len-1);//字符串后len-k个逆序
my_reverse(arr,arr+len-1);//字符串整个逆序
}
int main()
{
char arr[20] = "abcdef";
int k = 0;
scanf("%d",&k);
left_remove(arr,k);
printf("%s",arr);
return 0;
}