54. 替换数字(第八期模拟笔试)
自己写的:
#include <iostream>
#include <string>
using namespace std;
int main()
{
string s;
string t;
cin >> s;
for (auto c : s)
{
if (c >= '1' && c <= '9')
t += "number";
else
t += string(1, c);
}
cout << t << endl;
return 0;
}
思路是字符串拼接。
卡哥思路提供了一种双指针的做法,值得学习。
精华部分:

这感觉像是一个套路,实用的套路。
卡哥代码:
#include <iostream>
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的大小,也就是将每个数字替换成"number"之后的大小
s.resize(s.size() + count * 5);
int sNewIndex = s.size() - 1;
// 从后往前将数字替换为"number"
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;
}
}
补充:
在 C++ 的std::string类中,字符串内部是存储了'\0'字符的。std::string类是对字符序列的封装,它以一种更方便的方式来处理字符串。
从底层实现来讲,std::string类通常会使用一个字符数组来存储字符串内容。为了与 C 风格字符串兼容(C 风格字符串是以'\0'作为结束标志的),
std::string在存储的字符序列末尾也会添加'\0'。不过,std::string的长度计算是不包括这个'\0'的。
例如,下面的代码可以说明这一点:
#include <iostream>
#include <string>
int main() {
std::string str = "Hello";
const char* c_str = str.c_str();//c_str()返回一个C风格的字符串
std::cout << "The length of std::string str is: " << str.length() << std::endl;
//输出字符串长度为5
std::cout << "The C - style string content: ";
for (size_t i = 0; c_str[i]!= '\0'; ++i) {
std::cout << c_str[i];
}
std::cout << std::endl;
return 0;
}
输出如下:

在这个例子中,str是一个std::string对象,当我们使用c_str()函数获取 C 风格的字符串时,可以看到它的内容是以'\0'结尾的,就像 C 风格字符串一样。但是str.length()返回的值是不包括'\0'的真实字符序列长度。

浙公网安备 33010602011771号