(C++字符串01) 反转字符串 反转字符串II 替换数字

发布于:2024-07-10 ⋅ 阅读:(138) ⋅ 点赞:(0)

344、反转字符串

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

时间复杂度:O(n)

空间复杂度:O(1)

541、反转字符串 II

class Solution {
public:
    string reverseStr(string s, int k) {
        int length = s.size();   
        int i = 0,j = k - 1;
        for(; j < length; i += 2*k, j += 2*k) {
            swap(s, i, j);
        }
        if(i < length-1) {
            swap(s, i, length - 1);
        }
        return s;
    }
    void swap(string& s, int l, int r) {
        char tem;
        for(int i = l, j = r; i < j; i++, j--) {
            tem = s[i];
            s[i] = s[j];
            s[j] = tem;
        }
    }
};

时间复杂度:O(n)

空间复杂度:O(1)

54、替换数字

resize()函数:扩容vector的大小,不会改变容量

语法:

        void resize(size_t count);       //扩容为 count 大小;
        void resize(size_t count, const T& value);        //扩容为 count 大小,新元素初始化为 value;

双指针:

        分别指向新旧数组的最后一个元素,从后往前遍历,遇到字母复制,遇到数字填充number。从后往前遍历可以减少元素移动次数。

#include <iostream>
using namespace std;
int main() {
    string s;
    while(cin >> s) {
        int count = 0;
        for(int i = 0; i < s.size(); i++) {
            if(s[i] >= '0' && s[i] <= '9') {
                count++;
            }
        }
        
        int left = s.size() - 1;
        s.resize(s.size() + count * 5);
        int right = s.size() - 1;
        
        while(right >= 0) {
            if(s[left] >= '0' && s[left] <= '9') {
                s[right--] = 'r';
                s[right--] = 'e';
                s[right--] = 'b';
                s[right--] = 'm';
                s[right--] = 'u';
                s[right--] = 'n';
            }else {
                s[right--] = s[left];
            }
            left--;
        }
        cout << s <<endl;
    }
}

时间复杂度:O(n)

空间复杂度:O(1)