LeetCode233,数字1的个数

规律如下:

如果第 i (自右向左,从1开始标号)上的数字是0,则第 i 位可能出现 1 的次数由更高位决定(若没有高位,则高位为0),等于更高位数乘以当前位数的权重(10i-1)

如果第 i 位上的数字为 1,则第 i 位上出现 1 的次数不仅受更高位影响,还受低位影响(若没有低位,则低位为0),等于更高位数乘以当前位数的权重 (10i-1) + (低位数 + 1)

如果第 i 位上的数字大于 1,则第 i 位上可能出现 1 的次数仅由更高位决定(若没有高位,则高位为0),等于(更高位数 + 1)乘以当前位数的权重 (10i-1)

总结:当前位的个数=     {\begin{cases} higher*{10_{}}^{i-1}& \text{ if } i<1 \\ higher*{10_{}}^{i-1}+lower+1 & \text{ if } i= 1\\ (higher+1)*{10_{}}^{i-1}& \text{ if } i>1 \end{cases}}{}

代码如下:

class Solution {
public:
    int NumberOf1Between1AndN_Solution(int n)
    {
        int count=0;
        int high=n;
        int cur=0,b=1;
        while(high>0)
        {
            cur=high%10;
            high/=10;
            count+=high*b;
            if(cur==1){
                count+=n%b+1;
            }else if(cur>1){
                count+=b;
            }
            b*=10;
        }
        return count;
    }
};

 

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值