42翻转单词顺序列+注意该题找单词的方法
题目描述
牛客最近来了一个新员工Fish,每天早晨总是会拿着一本英文杂志,写些句子在本子上。同事Cat对Fish写的内容颇感兴趣,有一天他向Fish借来翻看,但却读不懂它的意思。例如,“student. a am I”。后来才意识到,这家伙原来把句子单词的顺序翻转了,正确的句子应该是“I am a student.”。Cat对一一的翻转这些单词顺序可不在行,你能帮助他么?
思路:两步反转法,先整体反转,然后每个单词进行反转。
找单词的方法是找相应的空格。
如果start的位置是空格就++,如果end的地方是空格就--或者是末尾结束符,就进行反转,一定要记得自己定义一个反转函数。
其他在单词中间的情况就++end。找空格。
class Solution { public: void helper(string &str,int start,int end){ for(start,end;start < end;++start,--end){ swap(str[start],str[end]); } } string ReverseSentence(string str) { if(str.size() == 0){ return ""; } helper(str,0,str.size() - 1); int start = 0,end = 0; while(str[start] != '\0'){ if(str[start] == ' '){ ++start; } else if(str[end] == ' ' || str[end] == '\0'){ helper(str,start,end - 1); start = end; ++end; } else{ ++end; } } return str; } };
这道题目还有进一步的变式题,就是两个单词之间有很多空格,最后只输出一个空格,这题的话,可以使用istringstream in(string),然后自己依据空格分割每一个单词,存储到一个数组里面,再从最后一个单词开始开始拼接,就得到了结果。
class Solution { public: /** * @param s : A string * @return : A string */ string reverseWords(string s) { // write your code here if (s.size() < 2) { return s; } istringstream ss(s); string tmp, result; vector<string> no_space; while (ss >> tmp) { no_space.push_back(tmp); } if(no_space.size() == 0){ return " "; } int i; for (i = no_space.size() - 1; i > 0; --i) { result.append(no_space[i]); result.append(" "); } result.append(no_space[i]); return result; } };