思考
其实这题不难,主要考察的是算法的效率。
- 辅助空间的使用。因为要将字符
'数字'
变为"number"
,则字符串s
的大小一定会变长,那么我们可以首先计算出s中的数字字符个数,然后将它扩充到我们需要的大小,再进行变换。 - 字符变换。最简单直接的方法是从头往后遍历,碰到字符是数字的,就对它进行变换。但是这里会让时间复杂度变得非常高,因为我们每次变换,都要将后面的字符往后移。所以我们在这里考虑从后处理的方式:双指针i和j,分别一个指向原来字符串的末尾,一个指向新的字符串末尾,我们要做的就是依次将旧字符串中的字符,移到新字符串中对应的位置,其中如果碰到了数字字符,则要把它换为
"number"
再放到后面去,这样我们每次就只是对一个字符进行处理,不影响其他字符,效率自然就更高一些。
cpp代码
#include <iostream>
using namespace std;
int main(){
string s;
while (cin >> s){
int count = 0; // 数字计数器
string number = {'n', 'u', 'm', 'b', 'e', 'r'};
int sOldSize = s.size();
for(int i = 0; i < sOldSize; i++){
if(s[i] >= '0' && s[i] <= '9')
count++;
}
int sNewSize = sOldSize + count * 5; // 计算数字变换成"number"后s的大小
s.resize(sNewSize);
for(int i = sOldSize-1, j = sNewSize-1; i >= 0; i--, j--){ //从后向前处理每一位字符
if(s[i] < '0' || s[i] > '9') s[j] = s[i];
else{
for(int k = 5; k >= 0; k--, j--){
s[j] = number[k];
}
j++;
}
}
cout << s << endl;
}
}