Bootstrap

代码随想录算法训练营第八天|344.反转字符串、541. 反转字符串II、卡码网:54.替换数字

344.反转字符串

很简单,没什么可说的。

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

541. 反转字符串II

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

54. 替换数字

如果不使用辅助空间,需要先将字符串扩容,然后从后向前插入新增内容。如果从前向后插入,每次插入元素都需要移动元素后面所有内容,时间复杂度为 O ( n 2 ) O(n^2) O(n2).

#include <iostream>
#include <string>
using namespace std;

int main () {
    string s;
    cin >> s;
    int num = 0;
    for (char c : s) 
        if (c >= '0' && c <= '9') 
            num++;
    int oldIndex = s.size() - 1;
    s.resize(s.size() + 5 * num);
    int newIndex = s.size() - 1;
    while (oldIndex >= 0) {
        if (s[oldIndex] >= '0' && s[oldIndex] <= '9') {
            s[newIndex--] = 'r';
            s[newIndex--] = 'e';
            s[newIndex--] = 'b';
            s[newIndex--] = 'm';
            s[newIndex--] = 'u';
            s[newIndex--] = 'n';
        }
        else 
            s[newIndex--] = s[oldIndex];
        oldIndex--;
    }
    cout << s << endl;
}
;