给定一个字符串,逐个翻转字符串中的每个单词。
说明:
无空格字符构成一个 单词 。
输入字符串可以在前面或者后面包含多余的空格,但是反转后的字符不能包括。
如果两个单词间有多余的空格,将反转后单词间的空格减少到只含一个。
示例 1:
输入:“the sky is blue”
输出:“blue is sky the”
示例 2:
输入:" hello world! "
输出:“world! hello”
解释:输入字符串可以在前面或者后面包含多余的空格,但是反转后的字符不能包括。
示例 3:
输入:“a good example”
输出:“example good a”
解释:如果两个单词间有多余的空格,将反转后单词间的空格减少到只含一个。
示例 4:
输入:s = " Bob Loves Alice "
输出:“Alice Loves Bob”
链接:https://leetcode-cn.com/problems/reverse-words-in-a-string
看完这个题目以后我就觉得很繁琐,但是我想到了这个相当于单词在后面先输出,可能是借助栈来实现,那么怎么能将每一个单词看作一个小字符串,放到栈里在弹出呢?然后就在题解中发现了这个类,百度到了一篇博客如下
istringstream 类用于执行C++风格的串流的输入操作
istringstream用空格作为字符串分隔符
#include <iostream>
#include <sstream>
#include <string>
using namespace std;
void test()
{
{
//istringstream iss;
//iss.str("#123 1.23 aaa ,zzz kk,k oo.jjj");
istringstream iss("#123 1.23 aaa ,zzz kk,k oo.jjj");
cout << iss.str() << endl;
char ch;
iss >> ch;
cout << ch << endl;
int i;
iss >> i;
cout << i << endl;
float f;
iss >> f;
cout << f << endl;
char buf[1024];
iss >> buf;
cout << buf << endl;
iss.ignore(100, ',');//ignore 忽略前100个字符或者忽略第一个逗号前面的内容包含第一个逗号,然后显示删除内容之后到第一个空格之间的字符。
iss >> buf;
cout << buf << endl;
}
}
int main(int argc, char* argv[])
{
test();
return 0;
}
结果:
https://www.cnblogs.com/dfyz/p/6759427.html
解题代码:
class Solution {
public:
string reverseWords(string s)
{
stack<string> stk;
string res, temp;
istringstream ss(s); // ss与数输入的字符串s绑定
while (ss >> temp) // 以空格为分隔符将其分割
{
stk.push(temp);
stk.push(" ");
}
if(!stk.empty())
stk.pop(); // 弹出最后压入的那个多余空格
while (! stk.empty())// 单词翻转后的新串
{
res += stk.top();
stk.pop();
}
return res;
}
};
链接:https://leetcode-cn.com/problems/reverse-words-in-a-string/solution/ling-pi-xi-jing-tiao-zhan-ci-ti-zui-jian-u6gw/