剑指 Offer 58 - I. 翻转单词顺序
写在前面,小白从零刷题,在解答会写出思路,正确答案,以及所有使用到的语法和知识点
1.istringstream+栈
使用isstringstream输入到栈内,然后定义一个字符串
class Solution {
public:
string reverseWords(string s) {
stack<string> stk;//初始化栈
string res,str;//初始化字符串
istringstream ss(s);//ss类似个中间变量
while (ss >> str) stk.push(str), stk.push(" ");//入栈,为什么双引号
if (!stk.empty()) stk.pop();//把最后输入的空格输出来
while (!stk.empty()) res += stk.top(), stk.pop();//访问栈顶是top
return res;
}
};
2.istringstream
没有栈
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);//substr函数取字符
}
};
3.遍历
从前到后遍历,将一个单词放在一个暂时变量,然后再反向存储
class Solution {
public:
string reverseWords(string s) {
int i = 0, n = s.size();
string tmp, ans;//tmp存放临时的一个word
while (i < n) {
while (i < n && s[i] == ' ') ++i; //跳过空格,让i指针指向单词第一位
if (i == n) break;
tmp = "";//每次都要清空一下临时变量
while (i < n && s[i] != ' ') tmp += s[i++]; //记录单词
ans = tmp + " " + ans;//存放在ans
}
if(!ans.empty()) ans.pop_back();//清空最上面的空格
return ans;
}
};
时间复杂度/空间复杂度分析/面试场景如何作答
面试场景-offer
- 时间复杂度:O(n)
- 空间复杂度: 空间复杂度为O(1)