从1到n整数中1出现的次数

思路:找规律,可以直接根据数n中每一个数字来判断包含1的个数

复杂度为O(len),len表示数n包含的数字个数。

方法:

假设数字为abcde,对于abcde中的每一个数字,可以根据该数字与1的关系,求在该数字对应位置上1出现的次数。

具体来说:

假设我们要求百位出现1的次数,此时我们可以根据c与1的关系,求出百位1出现的次数。

(1)如果c = 0,则1出现的次数等于ab * 100,即 c前面的数 * c对应的基数

在该情况下,百位出现1的次数只与c前面的数有关

(2)如果c = 1,则1出现的次数等于(ab * 100) + (de + 1),即(c前面的数 * c对应的基数) +( c后面的数 + 1)

在该情况下,百位出现1的次数与c前面和c后面的数有关。

(3)如果c = 2,则1出现的次数等于(ab + 1)*100,即c前面的数 +1)* c对应的基数

在该情况下,百位出现1的次数只与c前面的数有关。

举例:

对于12013,在百位处出现1的次数= 12 * 100 = 1200次

其分别是,00100 -00199,01100 -01199,02100 - 02199,...,11100 - 11199。

(1)由于因为百位 = 0,则以12为开头的数不会含有1。

(2)百位前面的数值能有00 - 11,即出现12次。由于百位后的数字有两位,因此其基数为100。

即,以00 - 11为开头的数,后面都可以由00 变化到99,即包含了所有1的情况。

--------------------------------------

对于12113,在百位处出现1的次数= (12 * 100 ) + (13+1)= 1214次

(1)包含足够1的情况:00100 - 00199,01100 - 01199,02100 - 02199,...,11100 - 11199

(2)包含部分1的情况:12100 - 12113

即,由于百位 = 1,则以00 - 12为开头的数在百位都含有1。

(1)当百位前面的数字为00-11时,此情况包含了所有1的情况。(00-99)

(2)当百位前面为数字为12时,此情况仅仅包含了部分1的情况(00-13)

---------------------------------------

对于12213,在百位处出现1的次数= (12+1) * 100 = 1300次

其分别是,00100 - 00199,01100 - 01199,02100 - 02199,...,11100 - 11199,12100 - 12199。

此时,百位前面的数无论怎么变化,后面都可以由00 变化到99,即包含了所有1的情况。

代码:

class Solution {
public:
    int NumberOf1Between1AndN_Solution(int n)
    {
    	int res = 0;
        int cur=n%10, forward=n/10, backward=0;
        int base = 1;
        if(n<=0)return res;
        
        while(n/base!=0)
        {
            if(cur==0)
                res += forward*base;
            if(cur==1)
                res += forward*base+backward+1;
            if(cur!=0 && cur!=1)
                res += (forward+1)*base;
            
            cur = forward%10;
            forward = forward/10;
            base = base*10;
            backward = n%base;
        }
        
        return res;
    }
};


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值