LeetCode刷题记录.Day15

反转字符串中的单词

151. 反转字符串中的单词 - 力扣(LeetCode)

class Solution {
public:
    void reverse(string& s, int start, int end){ //反转单词字符串,写法为左闭右闭,包括start和end
        for (int i = start, j = end; i < j; i++, j--) {
            swap(s[i], s[j]);
        }
    }
    void removeExtraSpaces(string& s) {//去除所有空格并在相邻单词之间添加空格, 快慢指针。
        int slow = 0;   //
        for (int i = 0; i < s.size(); ++i) { //i是快指针,跳过所有空格,只读取非空格数据
            if(s[i] != ' '){
                if(slow != 0) s[slow++] = ' '; //此时i指向新单词的开头,所以slow向前移一位,并且手动补上空格。
                while(i < s.size() && s[i] != ' '){
                    s[slow++] = s[i++];
                }
            }
        }
        s.resize(slow); //slow的大小即为去除多余空格后的大小。
    }

    string reverseWords(string s) {
        removeExtraSpaces(s);
        reverse(s, 0, s.size() - 1); //反转整个字符串
        int start = 0;
        for(int i = 0; i <= s.size(); i++){
            //指向最后或者指向空格
            if(i == s.size() || s[i] == ' '){
                reverse(s, start, i - 1);
                start = i + 1;//跳过空格
            }
        }
        return s;
    }
};

算是阶段性考核了,其实题目用到的方法都是之前的方法,但是很多细节要注意。自己尝试写了写还是很费神而且边写边改越改思路越乱。比如快慢指针去空格时去掉后还需要添加上一个。还有最后挨个单词反转字符串,自己写就漏掉了末尾的单词。

posted @ 2022-11-14 23:26  凱風快晴  阅读(22)  评论(0)    收藏  举报