代码随想录算法训练营第8天|344.541.05.151.58

95 阅读1分钟

344

第一思路

双指针一个指向头部,一个指向尾部,然后交换两个的位置

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

    }
};

一次ac

541

第一思路

外层一个指针一次移动2k,然后双指针法反转前k个

class Solution {
public:
    string reverseStr(string s, int k) {
        // 思路:外层一个指针一次移动2k,然后双指针法反转前k个
        for ( int i = 0; i < s.size(); i+=2*k){
            if ( i + k > s.size()) { // 剩余字符少于k
                int left = i;
                int right = s.size() - 1;
                while ( left < right) {
                    swap(s[left], s[right]);
                    left++;
                    right--;
                }
                break;
            }
            // if ( i + k < s.size() && i + 2*k > s.size()){
            //     int left = i;
            //     int right = i + k - 1;
            //     while (left < right) {
            //         swap(s[left], s[right]);
            //         left++;
            //         right--;
            //     }
            // }
            // int l = i;
            // int r = i + k - 1; //好像跟上面可以合并


            int left = i;
            int right = i + k - 1;
            while (left < right) {
                swap(s[left], s[right]);
                left++;
                right--;
            }

            
        }
        return s;

    }
};

一次ac

05

一开始没想到不消耗额外辅助空间的方法,看到题解思路后一次ac

总结

倒叙替换

151

总结 数组变长,从右往左遍历,数组变短,从左往右

58

class Solution {
public:
    int lengthOfLastWord(string s) {
        // 思路,去除多余空格,然后resize,然后倒叙遍历
        // 去除多余空格
        int slow = 0;
        for (int fast = 0; fast < s.size(); fast++) {
            if ( s[fast] != ' '){
                if ( slow != 0) s[slow++] = ' ';
                while ( fast < s.size() && s[fast] != ' '){
                    s[slow++] = s[fast++];
                }
            }
        }
        s.resize(slow);
        int count = 0;
        for ( int i = s.size() - 1; i >= 0; i--) {
            if (s[i] != ' ') count++;
            else break;
        }
        return count;

    }
};

一次AC