力扣:剑指 Offer 58 - I. 翻转单词顺序
力扣151. 翻转字符串里的单词
题目描述:
输入一个英文句子,翻转句子中单词的顺序,但单词内字符的顺序不变。为简单起见,标点符号和普通字母一样处理。例如输入字符串"I am a student. “,则输出"student. a am I”。
示例1️⃣:
输入: "the sky is blue"
输出: "blue is sky the"
示例2️⃣:
输入: " hello world! "
输出: "world! hello"
解释: 输入字符串可以在前面或者后面包含多余的空格,但是反转后的字符不能包括。
示例3️⃣:
输入: "a good example"
输出: "example good a"
解释: 如果两个单词间有多余的空格,将反转后单词间的空格减少到只含一个。
分析:
从字符串中截取单词,放置于临时容器中,依次取出并加上单一空格。
代码题解一:
class Solution {
public:
string reverseWords(string s) {
if(s.empty())return "";
s+=" ";
string tmp="";
vector<string>res;
for(char i:s){
if(i==' '){ //不可写成:
if(!tmp.empty()){ //if(i==' '&&!tmp.empty())
res.push_back(tmp);//它的否定else 为
tmp.clear(); //i!=' '||tmp.empty()
} //当tmp为空时,有可能加上前置或后置空格
}
else tmp+=i;
}
s.clear(); //清空s,使用原有的空间
for(int i=res.size()-1;i>=0;i--){
s+=res[i]; //从后往前,将res中储存的单词倒序输入s
if(i!=0)s+=" ";//单词间用单空格隔开
}
return s;
}
};
代码题解二:使用双指针截取
class Solution {
public:
string reverseWords(string s) {
if(s.empty())return "";
s+=" "; //关键,确保能取到最后一个单词
vector<string>res;
for(int i=0;i<s.size();i++){
if(s[i]!=' '){
int j=i;
while(s[j]!=' ')j++;
string tmp=s.substr(i,j-i);
res.push_back(tmp);
i=j;
}
}
s.clear(); //清空s,使用原有的空间
for(int i=res.size()-1;i>=0;i--){
s+=res[i];
if(i!=0)s+=" ";
}
return s;
}
};