PROBLEM
剑指 Offer 58 - I. 翻转单词顺序
难度 简单
MY ANSWER
使用栈读入单词,时间空间复杂度O(n)。还可使用双指针,从尾向前遍历,思路相似。
class Solution { public: string reverseWords(string s) { stack<string> voc; int start = 0, len = 1, flag = 0; cout<<isgraph(' ')<<endl; for(int i = 0; i < s.size(); i++) { if(!flag && isgraph(s[i])) { start = i; len = 1; flag = 1; } else if(flag && isgraph(s[i])) { len++; } if(!isgraph(s[i]) && flag || i == s.size() - 1 && isgraph(s[i]) && flag) { voc.push(s.substr(start, len)); flag = 0; } } string res; while(voc.size()) { res += voc.top() + " "; voc.pop(); } res.pop_back(); return res; } };
|
BETTER SOLUTION
使用istringstream流,可以将字符串按空格分隔输出。时间空间复杂度O(n)。
class Solution { public: string reverseWords(string s) { istringstream ss(s); string res, str; while(ss >> str) res = str + ' ' + res; return res.substr(0, res.size() - 1); } };
|
SUMMARY
学习使用istringstream:
istringstream ss(s);
将字符串赋值给流;
ss >> str
将流输出到str,每次输出按空格分隔的字符串。如
string str="i am a boy"; istringstream is(str); string s; while(is>>s) { cout<<s<<endl; }
|
输出:
i
am
a
boy