233. 数字 1 的个数
题目
233. 数字 1 的个数 - 力扣(LeetCode) (leetcode-cn.com)
给定一个整数 n
,计算所有小于等于 n
的非负整数中数字 1
出现的个数。
示例 1:
1 | 输入:n = 13 |
示例 2:
1 | 输入:n = 0 |
提示:
0 <= n <= 2 * 10^9
思路
是一个递推的问题。
方法一:直接递推
假设输入为 a*10^n^+b
中间情况:
只要递归:$$ f( a*10^n+b ) = f(b) + f ( a * 10^n-1 ) $$即可。
边界条件:
$$ f(x)=\left{ \begin {aligned} & 0,x<1\&1,1<=x<10 } \end {aligned} \right. $$
本方法会超时
方法二:避免重复计算
在
$$a*10^n+b$$
中,
如果
a>2
,在计算完b
之后,需要计算a*10^n^-1。容易发现:
当
a>2
的时候,在2~a
之间由于最高位都不是1,因此都是计算10^n-1^,可以合并为计算一次10^n-1^,之后乘上a-2
倍。当
a==2
的时候,计算2*10^n-1^,即计算与$$a*10^n+b$$ 相同位数,不过最高为是1时候的总的1的个数。计算
a-2
个b
可以合并为计算一个b
之后乘上a-2
,之后在计算2*10^n-1^即可。如果
a==1
:数字为$$10^n+b$$ ,首先有
b+1
个数字至少包含一个1,也就是不小于$$10^n$$的部分最高位包含1的个数,之后递归计算b
,算出来不小于10^n^部分包含的所有的1,在计算10^n^-1内的1的个数即可。
代码
1 | class Solution { |