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;
}

思路是字符串拼接。

卡哥思路提供了一种双指针的做法,值得学习。

精华部分:

img

这感觉像是一个套路,实用的套路。

卡哥代码:

#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;
}

输出如下:

img

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

posted @ 2025-01-15 15:15  hisun9  阅读(96)  评论(0)    收藏  举报