【剑指offer】翻转单词顺序列

来源:互联网 发布:怎么复制文件到mac 编辑:程序博客网 时间:2024/05/20 11:26

题目:牛客最近来了一个新员工Fish,每天早晨总是会拿着一本英文杂志,写些句子在本子上。同事Cat对Fish写的内容颇感兴趣,有一天他向Fish借来翻看,但却读不懂它的意思。例如,“student. a am I”。后来才意识到,这家伙原来把句子单词的顺序翻转了,正确的句子应该是“I am a student.”。Cat对一一的翻转这些单词顺序可不在行,你能帮助他么?

方法一分析:我们可以先把整个字符串给反转一遍,在从头到尾把每个单词反转一遍,凡是碰到空格就跳过去。题目不难但是我们要看清题目要求,没有说连续的空格只保留一个或开头、末尾不能是空格之类的,否则我们发现代码总是不能通过。

程序:

void Reverse(string& str, int begin, int end){ //反转str的begin和end区间内的字符;while (begin < end)swap(str[begin++], str[end--]);   }string ReverseSentence(string str){if (str.size()<=1)return str;Reverse(str, 0, str.size()-1);  //整个字符串取反;int begin = 0, end = 0;while (end<=str.size()){if (str[begin] == ' ')  //begin指向单词的第一个字符停止;{begin++;end++;}else if (str[end] == ' ' ||str[end] == '\0' ) {//end指向单词的最后一个字符的下一个停止;Reverse(str, begin, end-1);begin = ++end;}else  end++;}return str;}

方法二分析:我们可以从头到尾遍历字符串,碰到空格就插入到结果的最前面,碰到单词就按顺序先保存到一个字符串中,单词完了同样把字符串插入到结果的最前面。

程序:

string ReverseSentence(string str) {if (str.size() <= 1) return str;   //字符串为空或只有一个字符,直接返回;string s = "";    //保存最终的结果;while (!str.empty()){string t = "";while (!str.empty() && str[0] == ' ') {s.insert(s.begin(),' ');   //是空格直接插入到s的最前面;str.erase(str.begin());}while (!str.empty() && str[0] != ' ') {t.push_back(str[0]);    //把单词按顺序保存到t中;str.erase(str.begin());}s = t +  s;    //单词插入到s的前面;}return s;}



原创粉丝点击