卡码54 替换数字

1.O(n^2)

#include 
#include 

using namespace std;

void trans2number(string& s){
    string sinsert = "number";
    int n = s.size();
    int num = 0;
    for(int i = 0; i < n; i++){
        if(s[i] == '0' || s[i] == '1' || s[i] == '2' || s[i] == '3' || s[i] == '4' || s[i] == '5' || s[i] == '6' || s[i] == '7' || s[i] == '8' || s[i] == '9'){
            s.erase(i, 1);
            s.insert(i, sinsert);
            n = s.size();
        }
    }
}

int main(){
    string s;
    cin >> s;
    trans2number(s);
    cout << s << endl;
    return 0;
}

insert函数和erase函数会直接改变string长度。无需再手动改变

2.复杂度更低的算法

删除数字不用erase()函数,先遍历计算原字符串中有几个数字用asciii码比较大小判定即可;然后改变字符串尺寸=原来尺寸+数字数*5.定义双指针一个指在原字符串尾部、一个指在新字符串尾部,同时向前移动遇到数字则后面的指针插入‘r' 'e' ...'u' 'n'

#include 
#include 

using namespace std;

void trans2number(string& s){
    int n = s.size();
    int insert1 ,insert2;
    int nn = n;
    for(int i = 0; i < n; i++){
        if(s[i] >= '0' && s[i] <= '9'){
            nn += 5;
        }
    }
    s.resize(nn);
    insert1 = n-1;
    insert2 = nn-1;
    for(; insert1 >= 0; insert1--){
        if(s[insert1] >= 'a' && s[insert1] <= 'z'){
            s[insert2--] = s[insert1];
            
        }else{
            s[insert2--] = 'r';
            s[insert2--] = 'e';
            s[insert2--] = 'b';
            s[insert2--] = 'm';
            s[insert2--] = 'u';
            s[insert2--] = 'n';
        }
    }
}

int main(){
    string s;
    cin >> s;
    trans2number(s);
    cout << s << endl;
    return 0;
}

不要忘记resize()不然会越界。

替换数字 | 代码随想录

你可能感兴趣的:(c++,算法,开发语言)