面试100题:10.翻转句子中单词的顺序

输入一个英文句子,翻转句子中单词的顺序,但单词内字符的顺序不变。句子中单词以空格符隔开。为简单起见,标点符号和普通字母一样处理。例如输入“Iam a student.”,则输出“student. a am I”。

解一

  1. /*Title: 10.翻转句子中单词的顺序:解一 
  2. Author:  gocode 
  3. Date:    2012-10-16*/  
  4.    
  5. #include<iostream>  
  6. using namespace std;  
  7.    
  8. void Reverse(char* start,char* end)//翻转字符串  
  9. {  
  10.     if(start == NULL || end == NULL)  
  11.         return;  
  12.    
  13.     char temp;  
  14.     while(start<end)  
  15.     {  
  16.         temp = *start;  
  17.         *start = *end;  
  18.         *end = temp;  
  19.         start++;  
  20.         end--;  
  21.     }  
  22. }  
  23.    
  24. char* ReverceSentence(char* pstr)  
  25. {  
  26.     if(pstr == NULL)  
  27.         return NULL;  
  28.    
  29.     //先将整个句子翻转  
  30.     char* start=pstr;  
  31.     char* end= pstr + strlen(pstr) - 1;  
  32.     Reverse(start, end);  
  33.    
  34.     start = pstr;  
  35.     end = pstr;  
  36.    
  37.     //取出一个个单词,翻转之  
  38.     while(*start != '\0')  
  39.     {  
  40.         if(*start == ' ')//单词起始至非空格字符  
  41.         {  
  42.             start++;  
  43.             end++;  
  44.             continue;  
  45.         }  
  46.         else if(*end ==' ' || *end == '\0')//结束至空格或结束符前一个字符  
  47.         {  
  48.             Reverse(start,--end);  
  49.             start = ++end;  
  50.         }  
  51.         else  
  52.             end++;  
  53.     }  
  54.     return pstr;  
  55. }  
  56. int main()  
  57. {  
  58.     char sentence[] = "I am a student!";  
  59.     cout<<sentence<<endl;  
  60.     char*reverced = ReverceSentence(sentence);  
  61.     cout<<reverced<<endl;  
  62.     system("pause");  
  63.     return 0;  
  64. }  
解二
  1. /*Title: 10.翻转句子中单词的顺序:解二 
  2. Author:  gocode 
  3. Date:    2012-10-16*/  
  4.    
  5. #include "tchar.h"  
  6. #include <assert.h>  
  7. #include <iostream>  
  8. using namespace std;  
  9.    
  10. #define KEY_CHAR ' '  
  11.    
  12. // 反转起始位置为i32FirIndex,结束位置为i32EndIndex的字符串  
  13. void ReverseString(char *pszStr, int i32FirIndex, int i32EndIndex)  
  14. {  
  15.     assert(NULL != pszStr || i32FirIndex >= 0 || i32EndIndex >= 0);  
  16.     if (i32EndIndex <= i32FirIndex) return;  
  17.    
  18.     char chTemp;  
  19.     int i32FirIdx = i32FirIndex;  
  20.     int i32EndIdx = i32EndIndex;  
  21.    
  22.     for (; i32FirIdx < i32EndIdx; i32FirIdx++, i32EndIdx--)  
  23.     {  
  24.         chTemp = pszStr[i32FirIdx];  
  25.         pszStr[i32FirIdx] = pszStr[i32EndIdx];  
  26.         pszStr[i32EndIdx] = chTemp;  
  27.     }  
  28. }  
  29.    
  30. bool IsNeedReverseString(char *pszStr, int nLen)  
  31. {  
  32.     assert(NULL != pszStr || nLen > 0);  
  33.    
  34.     bool bRet = false;  
  35.     for (int i32I = 0; i32I < nLen; i32I++)  
  36.     {  
  37.         if (KEY_CHAR == pszStr[i32I])  
  38.         {  
  39.             bRet = true;  
  40.             break;  
  41.         }  
  42.     }  
  43.    
  44.     return bRet;  
  45. }  
  46.    
  47. int _tmain(int argc, _TCHAR* argv[])  
  48. {  
  49.     char aszStr[] = {"I am a boy."};  
  50.    
  51.     if (IsNeedReverseString(aszStr, strlen(aszStr)))  
  52.     {  
  53.         //Step 1:  
  54.         ReverseString(aszStr, 0, strlen(aszStr) - 1);  
  55.    
  56.         //Step 2:  
  57.         int i32CurIdx = 0;  
  58.         for (int i32I = 0; i32I < (int)strlen(aszStr); i32I++)  
  59.         {  
  60.             if (KEY_CHAR == aszStr[i32I])  
  61.             {  
  62.                 ReverseString(aszStr, i32CurIdx, i32I - 1);  
  63.                 i32CurIdx = i32I + 1;  
  64.             }  
  65.         }  
  66.         ReverseString(aszStr, i32CurIdx, (int)strlen(aszStr) - 1);  
  67.     }  
  68.    
  69.     cout << aszStr << endl;  
  70.     return 0;  
  71. }  
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值