下面的 sum_digit 函数试图求出从 $1$ 到 $n$(包含 $1$ 和 $n$)的数中,包含数字 $d$ 的个数。该函数的时间复杂度为( )。
#include <string>
int count_digit(int n, char d) {
int cnt = 0;
std::string s = std::to_string(n);
for (int i = 0; i < s.length(); i++)
if (s[i] == d)
cnt++;
return cnt;
}
int sum_digit(int n, char d) {
int sum = 0;
for (int i = 1; i <= n; i++)
sum += count_digit(i, d);
return sum;
}分析时间复杂度时关注循环层数和每层迭代次数,递归算法则分析递归树。注意最坏/最好/平均情况的区别。
分析复杂度时注意外层循环和内层循环的关联。例如内外两层都到n的循环不一定是O(n²),要看内层是否每次都在缩小。
【考点】时间复杂度分析|字符串转换|对数复杂度|循环嵌套
1. 考纲定位
2. 解题思维
3. 陷阱拆解
4. 反命题思维