剑指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++;
}
}
注意这里的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++;
}
#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;
}