题目描述
牛客最近来了一个新员工Fish,每天早晨总是会拿着一本英文杂志,写些句子在本子上。同事Cat对Fish写的内容颇感兴趣,有一天他向Fish借来翻看,但却读不懂它的意思。例如,“student. a am I”。后来才意识到,这家伙原来把句子单词的顺序翻转了,正确的句子应该是“I am a student.”。Cat对一一的翻转这些单词顺序可不在行,你能帮助他么?
最开始的解法:从后向前遍历数组,遇到空格则取得空格之后,下一个空格之前的字符串放入答案。由于第一个单词前没有空格,循环结束需要再放一次。
但是这段代码的时间复杂度是O(n2),还申请了新空间。
代码:
string GetString(string str,int start,int end) { string s = ""; for(int i = start; i < end;i++) { if(str[i] == ' ') break; s += str[i]; } return s; } string ReverseSentence(string str) { int len = str.length(); string res = ""; for(int i = len-1;i >= 0;i--) { if(str[i] == ' ') { res += GetString(str,i+1,len); res += " "; } } res += GetString(str,0,len); return res; }
这个代码和我的是一个意思但是比我的操作简单一下:
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; }
正确解法:注意这道题的题名,翻转字符串!和今天做的另一道 左旋转字符串是一个道理。
代码:
void Reverse(string &str,int i,int j) { char tmp; while(i<j) { tmp = str[i]; str[i++] = str[j]; str[j--] = tmp; } } string ReverseSentence(string str) { int len = str.length(); int tmp = 0; for(int i = 0; i < len;i++) { if(str[i] == ' ') { Reverse(str,tmp,i-1); tmp = i+1; } } Reverse(str,tmp,len-1); Reverse(str,0,len-1); return str; }