题源:卡码网 54. 替换数字
包含的头文件和命名空间
#include <iostream>
#include <cctype>
using namespace std;
#include <iostream>
:包含这个头文件是为了使用标准输入输出流对象,例如cin
和cout
。#include <cctype>
:这个头文件提供了一系列用于字符分类的函数,其中包括isdigit
函数,用于检查给定的字符是否是数字。using namespace std;
:这一行允许我们在不需要std::
前缀的情况下直接使用标准库中的名字(如cin
,cout
,string
等)。
主函数
int main() {
string s;
cin >> s;
string res;
for (char c : s) {
if (isdigit(c)) res += "number";
else res += c;
}
cout << res;
return 0;
}
string s;
:声明一个string
类型的变量s
,用于存储输入的字符串。cin >> s;
:从标准输入读取一行文本,并存储在变量s
中。注意,这种读取方式会在遇到空格、制表符或换行符时停止,因此它只读取一行中的第一个单词。string res;
:声明另一个string
类型的变量res
,用于构建最终的结果字符串。for (char c : s) { ... }
:使用基于范围的for
循环遍历字符串s
中的每一个字符。每次循环中,变量c
将被设置为s
中的当前字符。if (isdigit(c)) res += "number";
:检查当前字符c
是否为数字。如果是,将字符串 “number” 追加到res
中。else res += c;
:如果当前字符不是数字,将该字符追加到res
中。cout << res;
:将最终构建的字符串res
输出到标准输出。return 0;
:主函数返回 0,表示程序正常结束。
在分析提供的C++程序的时间复杂度时,我们关注的是代码执行时间随输入大小的增长率。这个程序中主要的操作集中在字符串的遍历和处理上。具体来看:
主要操作分析
-
字符串遍历:程序通过一个基于范围的for循环对输入的字符串
s
进行遍历。对于字符串的每一个字符,都执行了一定的操作。 -
字符判断:对于字符串中的每个字符,使用
isdigit
函数来判断这个字符是否为数字。isdigit
函数的时间复杂度是常数时间 ( O(1) )。 -
字符串连接:根据字符是否为数字,将字符或字符串 “number” 连接到结果字符串
res
上。字符串连接的时间复杂度取决于字符串的实现和当前长度。在最坏的情况下,字符串的连接操作可能需要时间复杂度为 ( O(n) ),其中 ( n ) 是最终字符串的长度。这是因为可能需要重新分配内存来容纳更大的字符串。
-
时间复杂度
最坏情况下的时间复杂度是 ( O(n^2) ),其中 ( n ) 是输入字符串的长度。这是因为每次追加操作都可能涉及到对整个结果字符串的复制,随着迭代次数的增加,总的执行时间是字符串长度的平方级别。 -
空间复杂度
最坏情况下的空间复杂度是 ( O(n) )。这里的 ( n ) 指的是输入字符串的长度,而结果字符串可能达到 ( 6n ) 的空间占用。然而,空间复杂度通常表示为输入大小的最高次项系数,忽略常数和低阶项,所以我们将空间复杂度表示为 ( O(n) )。