专栏主页:计算机专业基础知识总结(适用于期末复习考研刷题求职面试)系列文章https://blog.csdn.net/seeker1994/category_12585732.html
题目描述
牛客最近来了一个新员工Fish,每天早晨总是会拿着一本英文杂志,写些句子在本子上。同事Cat对Fish写的内容颇感兴趣,有一天他向Fish借来翻看,但却读不懂它的意思。例如,“student. a am I”。后来才意识到,这家伙原来把句子单词的顺序翻转了,正确的句子应该是“I am a student.”。Cat对一一的翻转这些单词顺序可不在行,你能帮助他么?
题解报告
最优解法:参考上面的字符串左移,两个空格间的反转,最后在总的反转一次。或者先反转一次,再局部反转都可以。
void reverse(string &str,int l,int r){char t;while(l < r){t=str[l]; str[l]=str[r]; str[r]=t;l++; r--; }
}
string ReverseSentence(string str) {int l = 0, r = -1;for(int i = 0; i < str.size(); i++){if(str[i] == ' '){r = i;reverse(str,l,r-1);l = i + 1;}}if(r != -1){reverse(str,l,str.size()-1);//翻转最后一个单词 reverse(str,0,str.size()-1);}return str;
}
其他实现:1:java 的话可以split按照空格分隔,然后从后往前将单词追加到StringBuffer中。2:类似于链表头插法的思想
string ReverseSentence(string str) {string res = "", tmp = "";for(unsigned int i = 0; i < str.size(); ++i){if(str[i] == ' '){res = " " + tmp + res;tmp = "";}else tmp += str[i];}if(tmp.size()) res = tmp + res;return res;
}
专栏主页:计算机专业基础知识总结(适用于期末复习考研刷题求职面试)系列文章https://blog.csdn.net/seeker1994/category_12585732.html