【c++】【字符串】【s和&s的区别】代码随想录算法训练营day8 | ● 344反转字符串 ● 541. 反转字符串 II●151. 反转字符串中的单词

182 阅读2分钟

344. 反转字符串(未用库函数)

image.png

思路

双指针,前后相向而行,互换

public:
    void reverseString(vector<char>& s) {
        for(int i=0, j = s.size()-1; i <  s.size()/2; i++ ,j--){
            swap(s[i], s[j]);
        }

    }
};

541. 反转字符串 II(i每次跳跃2k步)

image.png

收获

每次竟然可移动 2 * k ,i += (2 * k)

public:
    string reverseStr(string s, int k) {
        for(int i = 0; i<s.size(); i+= 2*k){
            if(i+k <= s.size()){
                reverse(s.begin()+i, s.begin()+i+k);
            }else{
                reverse(s.begin()+i, s.end());
            }

        }
    return s;
    }
};

151. 反转字符串中的单词(用时1.5h)

image.png

补充知识点

++i与i++的区别

++i是先改变i的值即加1后再使用i的值;而i++是先使用i的值在改变它的值即加。

for循环内部仅形式不同:当i++循环和++i循环在for循环内部,虽然形式上明显不同,但输出结果可以一样。

s和&s的区别

局部变量:s

在外面是s,你传进去后,再怎么改s,外面的s值是不变的;

真实地址变量:&s

传进去之后,怎么改,外面的s也会跟着改

public:
    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] == ' ' ){  //一个单词的结束是空格and结尾
                reverse(s, start, i - 1);
                start = i + 1;  //找下一个单词
            }
        }
    return s;
    }
    void removeExtraSpaces(string& s){ //函数:去除所有空格,并在相邻之间添加空格,用快慢指针
            int slow = 0;  //思想参考:27移除元素
            for(int i = 0; i<s.size(); ++i){
                if(s[i] != ' '){
                    if(slow != 0){  // 手动控制空格,给单词之间添加空格。slow != 0说明不是第一个单词,需要在单词前添加空格。
                        s[slow++] = ' ';
                    }
                    while(i < s.size() && s[i] != ' '){
                        s[slow++] = s[i++];  //补上该单词,遇到空格说明单词结束
                    }

                }
            }
        s.resize(slow);  //resize(n) 调整容器的长度大小,使其能容纳n个元素
    }
    void reverse(string& s, int start, int end){
        for(int i =start, j = end; i < s.size()/2; i++, j--){
            swap(s[i], s[j]);
        }

    }
};