字符串左旋的实现和优化方法

字符串左旋

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值