代码随想录:反转字符串中的单词

代码随想录:反转字符串中的单词

我靠这题是真复杂,搞了一个多小时。

思路是简单的,先把多余的空格去掉,再将整个字符串反转,之后反转其中的每一个。

这个去掉,是用之前数组题目,移除元素的思路,双指针,一个遍历,一个指向插入位置。

另外要考虑连续空格的问题。

末尾要考虑有没有空格,如果有才需要去除。

另外,才发现之前对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;
    }
};
posted @ 2024-12-03 22:35  huigugu  阅读(3)  评论(0编辑  收藏  举报