leetcode面试题58 - I. 翻转单词顺序
程序员文章站
2022-04-30 18:21:53
...
题目来源
解题方法
istreamstring秒解
istreamstring详解
附上代码
class Solution {
public:
string reverseWords(string s) {
string res;
stack<string> stack;
string str;
istringstream ss(s);
while(ss >> str){
stack.push(str);
stack.push(" ");
}
if(stack.size()!=0)
stack.pop();
while(stack.size()!=0){
res+=stack.top();
stack.pop();
}
return res;
}
};
注意点
1.头文件
for循环从尾遍历
思路:从s的最后一个非空格字符开始,记录len,如果遇到空格字符,则说明单词结束,存入res中,并置零len
易错点:若s[0]不是空格,在循环结束时可能导致单词遗漏,因此用if判断是不是还有漏的单词,再存入,最后处理掉res最后一个空格即为答案
附上代码
class Solution {
public:
string reverseWords(string s) {
string res;
string str;
int len=0;
for(int i=s.size()-1;i>=0;i--){
if(s[i]==' ' && len!=0){
res+=s.substr(i+1, len) + " ";
len=0;
}
if(s[i]!=' ')
len++;
}
if(len!=0)
res+=s.substr(0,len)+" ";
if(res.size()!=0)
res.erase(res.size()-1,1);
return res;
}
};
自己写split函数
思路:先去除头尾多余空格,调用split函数,最后写入res即可
附上代码
class Solution {
public:
string reverseWords(string s)
{
s=trimAll(s);
if (s.length() == 0) return "";
vector<string> word = split(s, ' ');
string str = "";
for (int i = word.size() - 1; i > 0; i--)
{
str += word[i];
str.push_back(' ');
}
str += word[0];
return str;
}
vector<string> split(string str, char ch)
{
vector<string> res;
string tmp="";
for(int i=0;i<str.size();i++){
if(str[i] !=ch)
tmp+=str[i];
else{
if(tmp.size()!=0){
cout << tmp << endl;
res.push_back(tmp);
tmp="";
}
}
}
cout<< tmp<<endl;
if(tmp.size()!=0)
res.push_back(tmp);
return res;
}
string trimAll(string str){
if(str.size()!=0){
str.erase(0,str.find_first_not_of(" "));
str.erase(str.find_last_not_of(" ")+1);
}
return str;
}
};
收获
istringstream的利用