文の単語の順序を反転


タイトル:
英語の文を入力して、文の中の単語の順序を反転しますが、単語内の文字の順序は変わりません.文の単語はスペースで区切られています.簡単にするために、句読点は普通のアルファベットと同じように処理されます.
例えば、「I am a student.」と入力すると、「student.a am I」が出力される.
分析:
文字列関連コードの作成はプログラマーのプログラミング能力とプログラミング習慣を反映することができるため、文字列関連の問題はプログラマーの筆記試験、面接問題の人気テーマである.本題もマイクロソフトを含む多くの会社に何度も愛用されたことがある.
本題は文を反転させる必要があるので、まず文のすべての文字を反転させます.このとき,文中の単語の順序が反転するだけでなく,単語内の文字も反転される.各単語の文字を逆さまにします.単語内の文字は2回反転されるため、入力時の順序と順序は一致します.
やはり上記の入力を例にとります.「I am a student.」のすべての文字を反転して「.tneduts a ma I」を得、各単語の文字の順序を反転して「students.a am I」を得、要求に合致する出力である.
参照コード:
///////////////////////////////////////////////////////////////////////
// Reverse a string between two pointers
// Input: pBegin - the begin pointer in a string
//        pEnd   - the end pointer in a string
///////////////////////////////////////////////////////////////////////
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 the word order in a sentence, but maintain the character
// order inside a word
// Input: pData - the sentence to be reversed
///////////////////////////////////////////////////////////////////////
char* ReverseSentence(char *pData)
{
      if(pData == NULL)
            return NULL;

      char *pBegin = pData;
      char *pEnd = pData;

      while(*pEnd != '\0')
            pEnd ++;
      pEnd--;

      // Reverse the whole sentence
      Reverse(pBegin, pEnd);

      // Reverse every word in the sentence
      pBegin = pEnd = pData;
      while(*pBegin != '\0')
      {
            if(*pBegin == ' ')
            {
                  pBegin ++;
                  pEnd ++;
                  continue;
            }
            // A word is between with pBegin and pEnd, reverse it
            else if(*pEnd == ' ' || *pEnd == '\0')
            {
                  Reverse(pBegin, --pEnd);
                  pBegin = ++pEnd;
            }
            else
            {
                  pEnd ++;
            }
      }

      return pData;
}

原文住所:http://zhedahht.blog.163.com/blog/static/254111742007289205219/