题目:
输入一个英文句子,翻转句子中单词的顺序,但单词内字符的顺序不变。为简单起见,标点符号和普通字母一样处理。
例如输入字符串“I am a student.”,则输出”student. a am I”.
思路:
这是一道常见的面试题,思路分两步:
1、翻转句子中的所有字符;
2、翻转句子中每一个单词;
代码:
#include <iostream> #include <string.h> using namespace std; void Reverse(char* pBegin,char* pEnd){ if(pBegin==NULL || pEnd==NULL) return; char tmp; while(pBegin<pEnd){ tmp=*pBegin; *pBegin=*pEnd; *pEnd=tmp; pBegin++; pEnd--; } } char* ReverseSentence(char* pData){ if(pData==NULL) return NULL; char* pBegin=pData; /* char* pEnd=pData; while(*pEnd!='\0') pEnd++; pEnd--; */ int len=strlen(pData); char* pEnd=pData+len-1; Reverse(pBegin,pEnd); pBegin=pEnd=pData; while(*pBegin!='\0'){ if(*pBegin==' '){ pBegin++; pEnd++; } else if(*pEnd==' ' || *pEnd=='\0'){ Reverse(pBegin,--pEnd); pBegin=++pEnd; } else{ pEnd++; } } return pData; } int main() { char data[]="Hello world!"; cout << ReverseSentence(data) << endl; return 0; }
在线测试OJ:
http://www.nowcoder.com/books/coding-interviews/3194a4f4cf814f63919d0790578d51f3?rp=2
AC代码:
class Solution { public: string ReverseSentence(string str) { int len=str.length(); if(len<=1) return str; int pBegin=0; int pEnd=len-1; Reverse(str,pBegin,pEnd); pBegin=0; pEnd=0; while(pBegin<=len-1){ if(str[pBegin]==' '){ pBegin++; pEnd++; } else if(str[pEnd]==' ' || pEnd==len){ Reverse(str,pBegin,pEnd-1); pBegin=++pEnd; } else pEnd++; } return str; } void Reverse(string &str,int pBegin,int pEnd){ char tmp; while(pBegin<pEnd){ tmp=str[pBegin]; str[pBegin]=str[pEnd]; str[pEnd]=tmp; pBegin++; pEnd--; } } };