剑指offer刷题:剑指 Offer 43.1~n整数中1出现的次数

题目描述:
输入一个整数 n ,求1~n这n个整数的十进制表示中1出现的次数。
例如,输入12,1~12这些整数中包含1 的数字有1、10、11和12,1一共出现了5次。
思路参考:
链接:https://leetcode-cn.com/problems/1nzheng-shu-zhong-1chu-xian-de-ci-shu-lcof/solution/mian-shi-ti-43-1n-zheng-shu-zhong-1-chu-xian-de-2/
来源:力扣(LeetCode)

找规律即可
/*
我们假设高位为high,当前位为cur,低位为low,i代表着需要统计的位置数(1对应个位,10对应十位,100对应百位),则对每一位的个数count有:
cur=0,count = highi;
cur=1,count=high
i+low+1;
cur>1,count=high*i+i
*/

class Solution {
    
    
public:
    int countDigitOne(int n) {
    
    
       int count = 0;
       long i = 1;//指向遍历的位数,如i=1即个位,i=10即十位,...,因为n可以有31位,所以10^31用long存储
       while(n/i!=0){
    
    
           //n/i控制遍历的次数,将所有的位数都遍历完毕
            long high = n/(10*i);//将当前位之前的所有高位都存在high中
            long cur = (n/i)%10;//将当前位记录在cur中,即我们每次都需要统计当前位上1出现的次数
            long low = n-(n/i)*i;
            if(cur == 0){
    
    
                count += high * i;
            } else if(cur == 1){
    
    
                count += high * i + low + 1;
            } else {
    
    
                count += high * i + i;
            }
            i = i * 10;//准备遍历下一位
       }
       return count;
    }
};

猜你喜欢

转载自blog.csdn.net/qq_21197471/article/details/107828779