本题目选自July大神博客系列【微软面试100题】:
july大神,该系列我主要用来记录我的学习笔记。
题目描述:输入一个英文句子,翻转句子中单词的顺序,但单词内字符的顺序不变。标点符号和普通字母一样处理。单词之间以空格隔开。
题目描述:输入一个英文句子,翻转句子中单词的顺序,但单词内字符的顺序不变。标点符号和普通字母一样处理。单词之间以空格隔开。
分析思路:(本题亦见于《剑指offer》面试题42)
先将整个句子翻转,此时句子中的单词也被翻转了,然后再将每个单词中的字符顺序进行翻转。
参考代码:
//翻转整个字符串句子中的字符顺序
void Reverse(char* pBegin, char* pEnd)
{
if(pBegin == NULL || pEnd == NULL)
return;
while(pBegin < pEnd)
{
char temp = *pBegin;
*pBegin = *pEnd;
*pEnd = temp;
++pBegin;
--pEnd;
}
}
//利用Reverse函数翻转句子中单词顺序
char* ReverseSentence(char* pData)
{
if(pData == NULL) return pData;
char *pBeg = pData;
char *pEnd = pData;
while(*pEnd != '\0')
pEnd++;
pEnd--;
//先翻转整个字符串句子中的字符顺序
Reverse(pBeg, pEnd);
//翻转单个单词
pBeg = pEnd = pData;
while(*pEnd != '\0')
{
while(*pEnd == ' ' && *pEnd != '\0')
++pEnd;
pBeg = pEnd;
while(*pEnd != ' ' && *pEnd != '\0')
++pEnd;
reverse(pBeg, --pEnd);
++pEnd;
}
return pData;
}