LeetCode#233. Number of Digit One

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,因为 1234100 ~ 1234199 ,注意是百位出现1的次数
所以会有1234*100次1相当于
n 1000 ∗ 100 \frac{n}{1000}*100 1000n100
接下来考虑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} 0n100+1100n<100100n<200n200

  • 小于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) 1000n100+min(max(n mod 1000100+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+1n10k+min(max(n mod 10k+110k+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;
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值