题目描述
输入一个整数 $n$ ,求1~n这n个整数的十进制表示中1出现的次数。
例如,输入12,1~12这些整数中包含1 的数字有1、10、11和12,1一共出现了5次。
示例 1:
1 | 输入:n = 12 |
示例 2:
1 | 输入:n = 13 |
限制:
- $1 <= n < 2^31$
注意:本题与主站 233 题相同:https://leetcode-cn.com/problems/number-of-digit-one/
算法
(数位统计) $O(log_{10}n)$
分情况讨论
假设当前枚举到了第 i 位,left 表示 i 左边数字,right 表示 i 右边数字
- 左边数字是 0 ~ (ab - 1),出现次数 ab * t(假设当前枚举位右边数字的位数为 x,则 $t = 10^x$
- 左边数字是 ab
2.1 当前位是 0,不做处理
2.2 当前位是 1,出现次数 right + 1
2.3 当前位大于 1,出现次数 t
时间复杂度
两次循环枚举每一位,所以时间复杂度为 $O(log_{10}n)$。
空间复杂度
$O(1)$
C++ 代码
1 | class Solution { |