代码随想录:反转字符串中的单词
代码随想录:反转字符串中的单词
我靠这题是真复杂,搞了一个多小时。
思路是简单的,先把多余的空格去掉,再将整个字符串反转,之后反转其中的每一个。
这个去掉,是用之前数组题目,移除元素的思路,双指针,一个遍历,一个指向插入位置。
另外要考虑连续空格的问题。
末尾要考虑有没有空格,如果有才需要去除。
另外,才发现之前对reverse的理解是不够深的,这个end作为迭代器,指向数组最后一个元素的下一个元素,而我一开传了两个begin+xxx,后面的只到数组的最后一个元素而没有到下一个。
reverse(s.begin(),s.end())
这还让我想起来了之前反转字符串Ⅱ中也用了reverse(begin+,begin+),但我发现那时+的是反转的元素个数,还真就那个不用+1。之后用这个方法一定要注意边界条件。
class Solution {
public:
string reverseWords(string s) {
reverse(s.begin(), s.end());
// 去掉所有多余的空格
int slow = 0;
int fast = 0;
while (fast < s.size()) {
// 开头的空格全去掉
if (s[fast] == ' ') {
fast++;
} else {
break;
}
}
while (fast < s.size()) {
// 中间的空格也去掉
if (fast > 1 && s[fast - 1] == ' ' && s[fast] == ' ') {
fast++;
} else {
s[slow] = s[fast];
slow++;
fast++;
}
}
if (slow > 1 && s[slow - 1] == ' ') {
s.resize(slow - 1);
} else {
s.resize(slow);
}
// 重置指针
slow = 0;
fast = 0;
while (fast <= s.size()) {
if (s[fast] == ' ' || fast == s.size()) {
reverse(s.begin() + slow, s.begin() + fast);
fast = fast + 1;
slow = fast;
}else{fast++;}
}
return s;
}
};