CC BY 4.0(除特别声明或转载文章外)
📝题目
给定一个字符串,逐个翻转字符串中的每个单词。
示例 1:
输入: "the sky is blue"
输出: "blue is sky the"
示例 2:
输入: " hello world! "
输出: "world! hello"
解释: 输入字符串可以在前面或者后面包含多余的空格,但是反转后的字符不能包括。
示例 3:
输入: "a good example"
输出: "example good a"
解释: 如果两个单词间有多余的空格,将反转后单词间的空格减少到只含一个。
📝思路
毫不费力的思路:分割出单词->反向拼接
可以用很多方式完成。Java支持库函数split()可以直接以空格为分隔符拆解,trim()筛掉前后空格,几行代码搞定;C++选手可以用stringstream或者手动实现分割拼接,据说此题的出题目的是考察双指针操作字符数组…
我用的正则表达式辅助实现分割,vector容器实现反向拼接…总之题目不是很难,但是手动实现时难免踩到很多坑🤦♀️
官方思路和题解请戳此😃
📝题解
string reverseWords(string s) {
vector<string> words;
int len = s.size();
string tmp = "";
regex reg("[ ]*");//空或纯空格时为真
for (int i = 0; i < len; ++i){
if (regex_match(tmp, reg)) tmp = "";
if (s[i] == ' ' && !regex_match(tmp, reg)){
words.push_back(tmp);
tmp = "";
}
else {
tmp += s[i];
}
}
if (!regex_match(tmp, reg)) words.push_back(tmp);
int len2 = words.size();
if (len2 == 0) return "";//题目没有讲但是输入为全空格时输出为空,这里容易被坑
string temp = "";
for (int i = 0; i < len2-1; ++i){
temp += words.back();
temp += " ";
words.pop_back();
}
temp += words.back();
return temp;
}