Leetcode 233 数字1的个数,排列组合计数问题

Leetcode 233 数字1的个数,排列组合计数问题_第1张图片

一个数一个数的判断,时间复杂度是O(nlogn) 显然不是面试管期望的回答

 

用数学方法,我们一次计算出每一位上所有小于等于n上1出现的个数。

举个例子abcdefg这个数以下的数,千位d上1出现的个数

如果d=0,abc可以从0取到abc-1,d取1,efg可以从0取到999,共有abc*1000种情况

如果d=1,除了之前的取法,efg还可以从0取到efg,还有efg+1种

如果d>1,  abc可以从0取到abc,d取1,efg可以从0取到999,共(abc+1)*1000,因此不难写出代码

class Solution {
public:
    int countDigitOne(int n) {
        if(n<=0) return 0;
        string digit = to_string(n);
        int res = 0;
        for(int i=0;i

 

 

 

你可能感兴趣的:(算法)