剑指offer二十八:翻转单词顺序VS左旋转字符串

剑指offer二十八:翻转单词顺序VS左旋转字符串

 剑指offer二十八:翻转单词顺序VS左旋转字符串

 剑指offer二十八:翻转单词顺序VS左旋转字符串

 剑指offer二十八:翻转单词顺序VS左旋转字符串

 

#include<iostream>
using namespace std;

void Reverse(char* pBegin, char* pEnd)
{
	if (pBegin == NULL || pEnd == NULL)
		return;
	while (pBegin < pEnd)
	{
		char temp = *pBegin;
		*pBegin = *pEnd;
		*pEnd = temp;
		pBegin++, pEnd--;
	}
}

char* reverseSentence(char* pData)
{
	if (pData == NULL)
		return NULL;
	char* pBegin = pData;
	char* pEnd = pData + strlen(pData)-1;
	//翻转整个句子
	Reverse(pBegin, pEnd);

	//翻转句子中的每个单词
	pBegin = pEnd = pData;
	while (*pEnd != '\0')
	{
		if (*pBegin == ' ')
		{
			pBegin++;
			pEnd++;
		}
		else if (*pEnd == ' ' || *pEnd == '\0')
		{
			pEnd--;
			Reverse(pBegin, pEnd);
			pEnd++;
			pBegin = pEnd;
		}
		else
			pEnd++;
	}
	
	return pData;
}

int main()
{
	char pData[] = "I am a student.";
	reverseSentence(pData);
	int i = 0;
	while (i<strlen(pData))
	{
		cout << pData[i];
		i++;
	}	
}


剑指offer二十八:翻转单词顺序VS左旋转字符串

注意这里的pData初始化不能使用char* pData = "I am a student." 这种形式,利用char指针定义字符串,此时字符串指针pData指向字符串常量,不成用*(pData+1)='o'来修改此常量,因为这个字符串常量放在常量区不能被修改。

这里用数组形式,char pData[]="I am a student.",此时不能用下面这种方式读该字符串,因为这里*pData是个地址常量。可以用pData+1来标识数组里的下一个元素,但不能用pData++,增量运算符只能在变量前使用,而不能在常量前使用。

while(*pData != '\0')
{
    cout<<*pData;
    pData++;
}

可以重新定义一个变量指针,如下:

char* temp = pData;
while(*temp != '\0')
{
    cout<<*temp;
    temp++;
}

 

剑指offer二十八:翻转单词顺序VS左旋转字符串

 剑指offer二十八:翻转单词顺序VS左旋转字符串

 剑指offer二十八:翻转单词顺序VS左旋转字符串

#include<iostream>
using namespace std;

//旋转单词字符串
void Reverse(char* pBegin, char* pEnd)
{
	if (pBegin == NULL || pEnd == NULL)
		return;
	while (pBegin < pEnd)
	{
		char temp = *pBegin;
		*pBegin = *pEnd;
		*pEnd = temp;
		pBegin++, pEnd--;
	}
}

//左旋n位字符串
char* LeftRotateString(char* pStr, int n)
{
	if (pStr != NULL)
	{
		int length = strlen(pStr);
		if (length > 0 && n > 0 && n < length)
		{
			char* pFirstStart = pStr;
			char* pFirstEnd = pStr + n - 1;
			char* pSecondStart = pStr + n;
			char* pSecondEnd = pStr + length - 1;

			//翻转字符串的前面n个字符
			Reverse(pFirstStart, pFirstEnd);
			//翻转字符串的的后面部分
			Reverse(pSecondStart, pSecondEnd);
			//翻转整个字符串
			Reverse(pFirstStart, pSecondEnd);
		}
	}
	return pStr;
}

int main()
{
	char pStr[] = "abcdefg";
	LeftRotateString(pStr, 2);
	char* temp = pStr;
	while (*temp != '\0')
	{
		cout << *temp;
		temp++;
	}
	cout << endl;
}


剑指offer二十八:翻转单词顺序VS左旋转字符串