给定数字n,找出0 ... n范围内有数字2的数字

时间:2012-06-22 13:12:24

标签: algorithm

这是一个面试问题。

  

给定数字n,找出0 ... n

范围内有数字2的数字

例如,

  

输入= 13输出= 2(2和12)

我给出了通常的O(n ^ 2)解决方案,但有更好的方法。

是否有任何'技巧'公式可以帮助我立即得到答案

4 个答案:

答案 0 :(得分:27)

计算具有数字2的数字。在小于10 k 的数字中,正好有9个 k 。然后它仍然是将数字从10 k 处理到n,其中

10^k <= n < 10^(k+1)

你可以通过单独处理第一个数字(案例2和其他必须区分),然后是前2个数字等来做。

例如,对于n = 2345,我们发现有9^3 = 729个数字没有数字2低于1000.在1000到1999的范围内还有729个这样的数字。然后在2000的范围内到2345,没有,总共1458,因此包含数字2的数字是

2345 - 1458 = 887

答案 1 :(得分:2)

参数'digit'是我们想要计算的那个,arg'number'是我们想要计算的地方。例如:如果我们想要计算'1'的出现次数,从0到12,使用digit = 1和number = 12调用函数,它将返回'1'的出现次数。

int countOccurrences(int digit, int number)
{
    int counter = 0;
    for(int i=1; i<number; i++)
    {
        int j = i;
        while(j > 0)
        {
            if(j%10 == digit)
                counter++;
            j /= 10;
        }
    }
    return counter;
}

答案 2 :(得分:0)

如果数字为ABCDEF,您可以计算范围[0,F], [0,E9], [0,D99], [0,C999], [0,B9999][0,A99999]中的'2'的数量并添加它们。

然后,对于范围[0, X9999...999],最高号码T = X9999...999可以写为(X+1) * 10<sup>nines</sup> -1

该范围内的'2'的数量为:

((X >= 2 ? 1/(X + 1)) : 0) + nines/10 ) * (T + 1);

那就是:如果X >= 2,在nines + 1位置有一个'2'的数字的分数是1/(X+1),那个位置总共有(T+1)/(X+1)'2' 。如果X < 2,则[0..T]上的数字在该位置没有“2”。

对于其他数字位置,很容易看出,在每个数字位置,数字的1/10都有一个'2',所以{0}处有(T+1)/10'2',{{1 }'2位于第1位,等等。总共(T+1)/10

此解决方案的复杂性为O(logN)。

答案 3 :(得分:0)

这就是我编写初稿(Python代码)的方法

def count2(n) :
    return [p for p in range(n+1) if '2' in str(p)]

然后会返回一个包含编号的列表。

就性能而言,它并没有那么糟糕,因为n = 10,000,000,平均迭代需要大约5.5秒