Ex58-I 反转单词顺序
题目描述
输入一个英文句子,翻转句子中单词的顺序,但单词内字符的顺序不变。为简单起见,标点符号和普通字母一样处理。例如输入字符串”I am a student. “,则输出”student. a am I”。
解题思路
以”I am a student”为例,步骤如下:
- 先将整个字符串反转得到:”tneduts a ma I”;
- 然后再将每个单词(空格之间是一个单词)反转,”student a am I”
代码
class Solution {
public:
std::string reverseWords(std::string s) {
// trim space
int i = 0;
while (i < s.size() && std::isspace(s[i])) {
++i;
}
std::string res;
if (i >= s.size()) return res;
bool is_last_space = false;
for (; i < s.size(); ++i) {
if (std::isspace(s[i]) && !is_last_space) {
is_last_space = true;
} else if (std::isspace(s[i]) && is_last_space) {
continue;
} else if (!std::isspace(s[i]) && is_last_space) {
res.push_back(' ');
res.push_back(s[i]);
is_last_space = false;
} else {
res.push_back(s[i]);
}
}
// reverse
std::reverse(res.begin(), res.end());
decltype(s.begin()) start = res.begin();
for (auto iter = res.begin(); iter != res.end(); ++iter) {
if (std::isspace(*iter)) {
std::reverse(start, iter);
start = iter + 1;
}
}
std::reverse(start, res.end());
return res;
}
};
结果
执行结果:通过
执行用时:4 ms, 在所有 C++ 提交中击败了94.57%的用户
内存消耗:7.8 MB, 在所有 C++ 提交中击败了85.39%的用户