题目解析
* 输入输出:第一行输入正整数 nnn(范围上限),第二行输入目标数字 kkk(1≤k≤91 \leq k \leq 91≤k≤9);输出 kkk 在整数 111 到 nnn 的所有数位中出现的总次数。
* 数据范围:1≤n≤10001 \leq n \leq 10001≤n≤1000,数据规模极小,允许逐位检查每个数字。
* 复杂度要求:时间复杂度 O(n⋅log10n)O(n \cdot \log_{10}n)O(n⋅log10 n)(最多遍历 1000×41000 \times 41000×4 个数位),空间复杂度 O(1)O(1)O(1) 或 O(logn)O(\log n)O(logn)(字符串临时空间)。
* 算法知识点:模拟、枚举、数位统计、字符串转换
思路解析
1. 问题分解:将“统计区间 [1,n][1, n][1,n]”分解为对每个整数单独统计并累加。即遍历 i∈[1,n]i \in [1, n]i∈[1,n],计算数字 iii 中包含多少个 kkk,求和得答案。
2. 数位提取(字符串法):对于单个整数 xxx,利用 to_string(x) 将其转换为字符串,遍历每个字符:
* 通过 s[i] - '0' 将字符转换为对应的数值;
* 若等于 kkk,则计数器加一。
注:也可使用数学方法(x % 10 取个位后 x /= 10),但字符串法代码更简洁。
3. 累加输出:主函数中维护累加器 ans,调用统计函数并输出最终结果。
完整代码