专栏主页:计算机专业基础知识总结(适用于期末复习考研刷题求职面试)系列文章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