题目42:翻转单词顺序,翻转句子中单词的顺序,但单词内字符的顺序不变,标点符号和普通字母一样处理。如输入 I am a student.输出student. a am i
思路:对句子进行翻转,再对单词进行翻转。
void Reverse(char *pBegin , char *pEnd)
{
if(pBegin == NULL || pEnd == NULL)
return;
char temp;
while(pBegin < pEnd)
{
temp = *pBegin ;
*pBegin = *pEnd ;
*pEnd = temp;
pBegin++;
pEnd--;
}
}
char * ReverseSentence(char *pData)
{
if(pData == NULL)
return NULL;
char *pBegin = pData;
char *pEnd = pData;
while(*pEnd != '\0')
{
pEnd++;
}
pEnd--;
Reverse(pBegin , pEnd);
pBegin=pEnd=pData;
while(*pBegin !='\0')
{
if(*pBegin == ' ')//开始为空,则说明pBegin还没指向一个单词,这时都增1
{
pBegin++;
pEnd++;
}
else if(*pEnd == ' ' || *pEnd == '\0')//pBegin不为空,pEnd为空,则两者之间是一个单词
{
Reverse(pBegin,--pEnd);
pBegin = ++pEnd ;
}
else //pBegin不为空,pEnd不为空,也不是末尾,说明pEnd还没指向该单词的词尾,则增1
{
pEnd++;
}
}
return pData;
}
总结:对于拆出句子中的单词,我的第一想法是先判空格,跳到单词的词首,再循环,找到单词的词尾,再循环判空格去找单词的词首,但题目中用两个指针的做法感觉很简洁,经常碰到用两个指针的时候,比如在链表中找倒数第k个结点,判断一个链表是否形成环等等。