剑指 Offer 43. 1~n 整数中 1 出现的次数

输入一个整数 n ,求1~n这n个整数的十进制表示中1出现的次数。

例如,输入12,1~12这些整数中包含1 的数字有1、10、11和12,1一共出现了5次。

示例 1:

输入:n = 12
输出:5

示例 2:

输入:n = 13
输出:6

限制:

1 <= n < 2^31

因为是1的出现次数,可以拆解成0~n上,每一位出现了多少此1
所以继续拆解例如109
对于个位:
前面类似于0~407此循环,每次循环0 ~ 9出现1此1,所以一共出现407*1+ 0 ~ 9,即408

对于十位:
前面循环40此,每次是0~100 那么对于十位来说就是出现了10此,
40*10 + 0 = 400

对于百位:1有些特殊,因为本身就是1所以低位的数也要算上例如14 那么就是010 + 4+1
5
100 + 09 +1=510

所以得出规律:
假设当前位a,低位b,高位c

a=0   当前位贡献: c*位数(个位就是1,十位10,百位100)

a=1   当前位贡献:c*位数+b+1

a>1   当前位贡献:c*位数+位数
class Solution {
    
    
public:
    int countDigitOne(int n) {
    
    
        long sum=0;
        int b=0;
        for(long i=1;n!=0;i*=10)
        {
    
    
            int a=n%10;
            int c=n/10;
            if(a==0)
            {
    
    
                sum+=c*i;
            }
            else if(a==1)
            {
    
    
                sum+=c*i+b+1;
            }
            else
            {
    
    
                sum+=c*i+i;
            }
            b=b+a*i;
            n/=10;
        }
        return sum;

    }
};

猜你喜欢

转载自blog.csdn.net/qq_43624038/article/details/113601803