字符串的移位(要求空间为1,使用翻转的方法)

定义字符串的左旋转操作:把前面若干个移动到尾部。
如把字符串 abcdef左旋转 2位得到字符串 cdefab。
请实现字符串左旋转的函数要求时间对长度为 n的字符串操作复杂度为 O(n),辅助内存为 O(1)。

分析:把字符串看成有两段组成的,记位XY。左旋转相当于要把字符串XY 变成YX。
我们先在字符串上定义一种翻转的操作,就是翻转字符串中字符的先后顺序。把X 翻转后
记为XT。显然有(XT)T=X。
我们首先对X 和Y 两段分别进行翻转操作,这样就能得到XTYT。
接着再对XTYT 进行翻转操作,得到(XTYT)T=(YT)T(XT)T=YX。正好是我们期待的结果。

 

#include<iostream>
using namespace std;
void reverse(char *str,int n)
{
	char *start=str,*end=str+n-1;
	while(start<end)
	{
		char c=*start;
		*start=*end;
		*end=c;
		start++;
		end--;
	}
}
int main()
{
	char string[100];int n;
	while(cin>>string>>n)
	{
		reverse(string,n);
		reverse(string+n,strlen(string)-n);
		reverse(string,strlen(string));
		cout<<string<<endl;
	}
	return 0;
}

 

 

 

posted @ 2012-10-23 15:02  代码改变未来  阅读(314)  评论(0编辑  收藏  举报