233. Number of Digit One
Given an integer n
, count the total number of digit 1 appearing in all non-negative integers less than or equal to n
.
Example 1:
Input: n = 13 Output: 6
Example 2:
Input: n = 0 Output: 0
Constraints:
0 <= n <= 109
找规律
参考官方
假设n=1234567
我们以每一位会出现多少 1
,用百位来做栗子,前后可分为1234、567
1234
比百位大,都会出现100次 1
,因为 12341
00 ~ 12341
99 ,注意是百位出现1的次数
所以会有1234*100次1相当于
n
1000
∗
100
\frac{n}{1000}*100
1000n∗100
接下来考虑567,567是 n mod 1000
得到
这里分三种情况 n mod 1000
的值我们定义为
n
′
n'
n′
{
0
n
′
<
100
n
′
−
100
+
1
100
≤
n
′
<
200
100
n
′
≥
200
\begin{cases} 0& {n'<100}\\ n'-100+1& {100 \leq n'<200}\\ 100& { n'\geq 200} \end{cases}
⎩⎪⎨⎪⎧0n′−100+1100n′<100100≤n′<200n′≥200
- 小于100,百位为0不存在为1的情况
- 大于等于100,小于200则次数在 [1、100] 之间,比如159,百位会有60次出现
1
- 大于等于200,就是100次百位出现
1
综上所述,百位的计算公式为:
n
1000
∗
100
+
m
i
n
(
m
a
x
(
n
m
o
d
1000
−
100
+
1
,
0
)
,
100
)
\frac{n}{1000}*100+min(max(n\ mod\ 1000-100+1,0),100)
1000n∗100+min(max(n mod 1000−100+1,0),100)
通用公式,k代表位数
(
k
=
1
,
2
,
3
,
⋯
)
(k=1,2,3,\cdots)
(k=1,2,3,⋯)
n
1
0
k
+
1
∗
1
0
k
+
m
i
n
(
m
a
x
(
n
m
o
d
1
0
k
+
1
−
1
0
k
+
1
,
0
)
,
100
)
\frac{n}{10^{k+1}}*10^{k}+min(max(n\ mod\ 10^{k+1}-10^{k}+1,0),100)
10k+1n∗10k+min(max(n mod 10k+1−10k+1,0),100)
最后求和就可以了。
class Solution {
public int countDigitOne(int n) {
long a=1;
int sum=0;
while(a<=n){
sum+=(n/(a*10))*a+Math.min(Math.max(n%(a*10)-a+1,0),a);
a*=10;
}
return sum;
}
}