第一次使用卡玛网来做题,和力扣不同之处在于,头文件的引用和函数定义都没有给,全都需要自己来写,同时输入输出也需要自己来写,刚接触还是不太熟练。
第一种解法是使用内置函数replace,当匹配的字符在 ’0‘ 到 ’9‘的范围时,使用“number”将其替换。代码如下:
#include <iostream>
#include <string>
void replaceDigitsWithNumber(std::string &s) {
for (int i = 0; i < s.size(); ++i) {
if (s[i]>='0' && s[i] <='9') {
s.replace(i, 1, "number");
i += 5;
}
}
}
int main() {
std::string input;
std::cin >> input;
replaceDigitsWithNumber(input);
std::cout << input << std::endl;
return 0;
}
第二种写法是使用双指针法来完成,首先遍历一遍字符串,统计字符 0 到 9 的数目,然后将字符串空间进行扩展,之后从后向前检测并进行插入。
- 从后向前插入的好处是,不用在每次插入后,都将后续的元素都往后进行移动。
#include<bits/stdc++.h>
using namespace std;
int main() {
string s;
while (cin >> s) {
int sOldIndex = s.size() - 1;
int count = 0;
for (int i = 0; i < s.size(); i++) {
if (s[i] >= '0' && s[i] <= '9') {
count++;
}
}
s.resize(s.size() + count * 5);
int sNewIndex = s.size() - 1;
while (sOldIndex >= 0) {
if (s[sOldIndex] >= '0' && s[sOldIndex] <= '9') {
s[sNewIndex--] = 'r';
s[sNewIndex--] = 'e';
s[sNewIndex--] = 'b';
s[sNewIndex--] = 'm';
s[sNewIndex--] = 'u';
s[sNewIndex--] = 'n';
} else {
s[sNewIndex--] = s[sOldIndex];
}
sOldIndex--;
}
cout << s << endl;
}
}