//牛客最近来了一个新员工Fish,每天早晨总是会拿着一本英文杂志,写些句子在本子上。 //同事Cat对Fish写的内容颇感兴趣,有一天他向Fish借来翻看,但却读不懂它的意思。 //例如,“student. a am I”。后来才意识到,这家伙原来把句子单词的顺序翻转了,正确的句子应该是“I am a student.”。Cat对一一的翻转这些单词顺序可不在行,你能帮助他么? class Solution { public: string ReverseSentence(string str) { string res="",temp=""; for(unsigned int i=0;i<str.size();i++){ if(str[i] == ' ') res=" "+temp+res,temp=""; else temp+=str[i]; } if(temp.size()) res=temp+res; return res; } };//从前往后一直读取,遇到空格之后就把之前读取到的压到结果的前面并添加上空格。 //最后当循环结束,如果那个用来读取的字符串不为空,那么就再把它压到结果前,这次就不用再结果的最前面加空格了。 //先整体再局部 class Solution { public: //翻转str从s到e的部分 void ReverseWord(string &str, int s, int e) { while(s < e) swap(str[s++], str[e--]); } string ReverseSentence(string str) { ReverseWord(str, 0, str.size() - 1); //先整体翻转 int s = 0, e = 0; int i = 0; while(i < str.size()) { while(i < str.size() && str[i] == ' ') //空格跳过 i++; e = s = i; //记录单词的第一个字符的位置 while(i < str.size() && str[i] != ' ') //不是空格 找单词最后一个字符的位置 { i++; e++; } ReverseWord(str, s, e - 1); //局部翻转 } return str; } }; //先局部再整体 class Solution { public: string ReverseSentence(string str) { auto size = str.size(); if(size == 0) return ""; int mark=0;//标志位,作为单词的起点 str += ' ';//字符串尾补一个空格 for(int i = 0; i < size+1; ++i){ if(str[i] == ' '){//如果遇到空格,则从标志位到空格前一位的字符进行翻转,即每一个单词翻转 ReverseWord(str, mark, i-1); mark = i+1;//每一个单词翻转完后,标志位顺次移动到空格后的字符,即下一个单词的起点 } } str = str.substr(0, size);//取字符串str前size个字符,即去掉之前在末尾加上的空格 ReverseWord(str, 0, size-1);//对整体再进行翻转 return str; } void ReverseWord (string &str, int l, int r){ while(l < r){ swap(str[l], str[r]); ++l; --r; } } };