《劍指offer》:[42-1]左旋轉字串

塵虛緣_KY發表於2016-06-19

題目二:字串的左旋轉操作是把字串前面的若干個字元轉移到字串尾部。請定義一個函式實現字串左旋轉功能。

比如輸入字串"youareonly"和數字6,該函式將返回"onlyyouare"。

由於有了面試【42】的經驗和思路,我們可以這樣來解決該問題。用三次翻轉:
第一步:把整個字串分為兩個部分,前N個要移動的字元和剩下的字元,先翻轉前N個字元;"erauoyonly";
第二步:再翻轉後面剩下的字元:"erauoyylno";
第二步:最後在翻轉整個字元:"onlyyouare";

具體分析圖如下:


三步完美解決問題。
具體實現程式碼:
#include <iostream>
using namespace  std;
char str[]="youareonly";
void Reverse(char *pBegin,char *pEnd)
{
	if(NULL==pBegin || NULL==pEnd)
		return;
	while(pBegin<pEnd)
	{
		char temp=*pEnd;
		*pEnd=*pBegin;
		*pBegin=temp;
		pBegin++;
		pEnd--;
	}
}
void LeftMove(char *strr,int num)
{
	int length=static_cast<int>(strlen(strr));
	if(NULL==strr || num>=length)
		return;
	if(num<length && num>0 && length>0)
	{
		char *FirstStart=strr;
		char *FirstEnd=strr+num-1;
		char *SecondStart=strr+num;
		char *SecondEnd=strr+length-1;
		//第一步:翻轉第一部分,要左旋轉的幾個字元(個人覺得左旋的定義有問題,不過理解就好);
		Reverse(FirstStart,FirstEnd);
		//第二步:翻轉第二部分,翻轉剩下的字串;
		Reverse(SecondStart,SecondEnd);
		//第三步:翻轉整個字串;
		Reverse(FirstStart,SecondEnd);
	}
}
int main()
{
	char *result=NULL;
	cout<<"翻轉前字串:"<<str<<endl;
	LeftMove(str,6);
	cout<<"反轉後字串:"<<str<<endl;
	system("pause");
	return 0;
}

執行結果:



相關文章