每天一算法(字符串后移)

题目:
       定义字符串的左旋转操作:把字符串前面的若干个字符移动到字符串的尾部。
如把字符串abcdef左旋转2位得到字符串cdefab。请实现字符串左旋转的函数。
要求时间对长度为n的字符串操作的复杂度为O(n),辅助内存为O(1)。
 
解决方法
       先把0到k-1逆置,再把k到n-1逆置,再把0到n-1逆置。总的时间复杂度是O(n),空间复杂度因为没有额外的临时字符数组帮助,所以是本地操作,空间复杂度为O(1)
 
VS2010中运行程序如下:例子程序是正确的,,如果有什么错误,希望各位高手指定,,呵呵。。
#include<stdlib.h>
#include<string>
#include<iostream>

using namespace std;
//将字符串中从指针begin处到指针end处进行反转
void Reverse(char *begin,char *end)
{
	if(NULL == begin || NULL == end)
		return ;
	while(begin < end)
	{
		char x = *begin;
		*begin = *end;
		*end = x;
		begin ++;
		end --;
	}
}
//把字符串前面的n个字符移动到字符串的尾部。
void MoveToEnd(char *begin,const int n)
{
	if(NULL == begin)
		return ;
	int Length = strlen(begin);//字符数组的长度
	if((n > Length ) || 0 == n)
		return;
	else
	{
		char *FirstBegin = begin;
		char *FirstEnd = begin + n - 1;
		char *SecondBegin = begin +n;
		char *SecondEnd = begin + Length - 1;

		Reverse(FirstBegin,FirstEnd);
		Reverse(SecondBegin,SecondEnd);
		Reverse(FirstBegin,SecondEnd);
	}
}
int main()
{
	char a[] = "abcdef";
	MoveToEnd(a,2);
	cout<<a;

	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值