字符串移位之翻手算法

    一道面試題,將字符串左移,時間複雜度O(n),空間複雜度O(1)。一個方法就是翻手算法,特意瞭解了下,代碼如下。

#include "stdafx.h"
#include <iostream>

using namespace std;

//對字符串進行移位,使用“翻手算法”,時間複雜度爲O(n),空間複雜度爲O(1)
void Rorder(char *pStart,char *pEnd);                         //對字符串子串倒序
char *pszStringRotate(char *pszString,int nCharRotate);       //字符串移位函數
int main()
{
	char str[10] = "ABCDEFG";
	char *lstr = pszStringRotate(str,3);
	printf("%s\n",lstr);
}

void Rorder(char *pStart,char *pEnd)        //兩個指針,一個指向頭,一個指向尾,交換後,頭指針加1,尾指針減1。若頭指針小於尾指針,繼續交換,否則完畢
{
	char temp;
	while (pStart < pEnd)
	{
		temp = *pStart;
		*pStart = *pEnd;
		*pEnd = temp;
		++pStart;
		--pEnd;
	}
}

char *pszStringRotate(char *pszString,int nCharRotate)
{
	char *ptem = pszString;
	int n=0;
	while (*(pszString+n))                            //求字符串長度
	{
		++n;
	}
	if (n < nCharRotate)
	{
		return pszString;
	}

	Rorder(pszString,pszString+nCharRotate-1);          //前一部分  反轉
	pszString = ptem;            //歸爲
	Rorder(pszString+nCharRotate,pszString+n-1);      //後一部分  反轉
	pszString = ptem;
	Rorder(pszString,pszString+n-1);                  //整體反轉
	pszString = ptem;
	return ptem;
}
    基本思想是:先對前一部分進行反轉,然後對後一部分進行反轉,最後對整體反轉。




發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章