思路:
数学归纳法总结,借鉴大神思路
对于个位来说他的高位的个数就是它出现次数我们记为round,该为数字我们记为weight,如果个位数字为0,那么各位总的出现次为round,如果大于0出现次数为round+1。
对于10位,我们加入权重base,此时base为10,这时的round为n/base,weight为n%base。因为每一个round十位上的1出现了10次所以这时十位上1出现的个数为round10。当该位即十位为1时,1出现的次数与他的前一位个位上的数字有关我们记为former,此时十位上1的总数为round10+former+1(因为是从0开始数);当该位大于1时总数为round10+10即roundbase+base。
图片说明
更高位的套路相同。总结:
若weight为0,则1出现次数为roundbase
若weight为1,则1出现次数为round
base+former+1(former=n%base)
若weight大于1,则1出现次数为rount*base+base
代码如下

public int NumberOf1Between1AndN_Solution(int n) {
        int base = 1;
        int round =n;
        int count =0;
        int weight = 0;
        while(round>0){
            weight = round%10;
            round/=10;
            count+=round*base;
            if(weight==1){
                count+=n%base+1;
            }else if(weight>1){
                count+=base;
            }
            base*=10;
        }
        return count;
    }