344. 反转字符串

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

 

541. 反转字符串 II

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

心得:这题主要就是两个条件,判断i+k是否还在合理范围内,如果在就反转前k个符号,否则就说明会溢出,那么就反转剩下所有的。

剑指 Offer 05. 替换空格

class Solution {
public:
    string replaceSpace(string s) {
        int oldSize = s.size();
        int count = 0;
        for(int i = 0; i < s.size(); i++){
            if(s[i] == ' ') count++;
        }
        s.resize(oldSize + 2*count);
        int newSize = s.size();
        for(int i = oldSize-1, j = newSize-1; i < j; i--, j--){
            if(s[i] != ' ') s[j] = s[i];
            else{
                s[j] = '0';
                s[j-1] = '2';
                s[j-2] = '%';
                j -= 2;
            }
        }
        return s;
    }
};

心得:我第一次做这道题的时候是新建一个数组,再分别把字符放入,这样会浪费空间。题解的方法不用申请新数组就能解决。

151. 反转字符串中的单词

class Solution {
public:
    void removeExtraSpaces(string& s){
        int slowIndex=0;
        for (int i=0; i<s.size(); i++){
            if (s[i]!=' '){
                if (slowIndex != 0) s[slowIndex++] = ' '; //单词之间用空格分隔,slow如果是在句首那就不用加了
                while(s[i] != ' ' && i < s.size()){
                    s[slowIndex++] = s[i++];
                }
            }
        }
        s.resize(slowIndex);
    }
    void reverseString(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.去除中间多余一个的空格
        //3.去除结尾空格
        //erase函数的时间复杂度为O(n),所以如果遍历整个字符串进行erase时间复杂度会增加到O(n方)
        //先将整个字符串reverse一遍,再按单词为单位进行reverse,这样可以获得最好的时间复杂度
        removeExtraSpaces(s);
        reverseString(s, 0, s.size()-1);
        int start = 0;
        for (int i=0; i<=s.size(); i++){ //需要<=,因为reverse是按照i-1
            if (s[i] == ' ' || i == s.size()){
                reverseString(s, start, i-1);
                start = i+1;
            }
        }
        return s;
    }
};

剑指 Offer 58 - II. 左旋转字符串

class Solution {
public:
    string reverseLeftWords(string s, int n) {
        reverse(s.begin(), s.end());
        reverse(s.begin(), s.begin()+s.size()-n);
        reverse(s.begin()+s.size()-n, s.end());
        return s;
    }
};

 


 
 
posted on 2023-03-08 22:52  小黑哈哈  阅读(75)  评论(0编辑  收藏  举报