leetcode——第151题——这题真的要难哭我了啊!!!——去除冗余空格的尾部空格想了好久

题目:
给定一个字符串,逐个翻转字符串中的每个单词。

说明:
无空格字符构成一个 单词 。
输入字符串可以在前面或者后面包含多余的空格,但是反转后的字符不能包括。
如果两个单词间有多余的空格,将反转后单词间的空格减少到只含一个。

class Solution {
public:
    // 1、移除冗余空格
    void removeExtraSpaces(string& s)
    {
        int slow = 0, fast = 0;
        // 1.1 去掉前面的空格
        while (s.size() > 0 && s[fast] = = ' ' && fast < s.size())
        {
            fast++;
            // 出错1:::::这里多写了一句 slow++
            // slow一定得是第一个字符开始,所以这里做 ++ 肯定是错误的
        }
        // 1.2 去掉中间的空格
        for (; fast < s.size(); fast++)
        {
            if (fast > 1 && s[fast] = = s[fast - 1] && s[fast] = = ' ')
            {
                continue;
            }
            else
            {
                s[slow] = s[fast];  // 注意最后尾部的处理,当执行完最后一个字符时,slow会再次+1
                slow++;     // 这里忘记 ++
            }
        }
        // 1.3 去掉尾部的空格
        // 感觉经过 1.2 之后,尾部要么就是1个空格,要么就是0个空格
        // 实践后,尾部要么两个空格,要么一个空格,要么没有空格,
        // 且经过1.2之后应该是有两个空格也就是
        // 出错二::::::if 语句不对
    // 这里slow是遍历之后自动 +1,所以 +1 后的值不一定有效,所以判断s[slow]是错误的
        // if (s[slow] = = ' ' && s[slow]= =s[slow-1])
         if (s[slow-1] == ' ' && slow > 1)
        {
            s.resize(slow-1);
        }
        else
        {
            s.resize(slow);
        }
    }
    // 2、反转字符串
    void reverse(string& s, int start, int end)
    {
        for (int i = start, j = end; i < j; i++, j--)
        {
            swap(s[i], s[j]);
        }
    }

    string reverseWords(string s)
    {
        // 写两个补充函数:1、移除冗余空格  2、反转字符串
        // 第一步:移除冗余空格
        removeExtraSpaces(s);

        // 第二步:将整个字符串反转
        reverse(s, 0, s.size()-1);

        // 第三步:将每个单词进行反转
        int slow = 0;
            for (int fast = 0; fast < s.size(); fast++)
            {
                if (s[fast] == ' ')
                {
                    reverse(s, slow, fast - 1);
                    slow = fast + 1;
                }
                if(fast==s.size()-1)
                {
                    reverse(s, slow, fast);
                }
            }
        return s;
    }
};
上一篇:Github即将破百万的PDF:编写高质量代码改善JAVA程序的151个建议


下一篇:151. 翻转字符串里的单词