这是一个面试问题。
给定数字n,找出0 ... n
范围内有数字2的数字
例如,
输入= 13输出= 2(2和12)
我给出了通常的O(n ^ 2)解决方案,但有更好的方法。
是否有任何'技巧'公式可以帮助我立即得到答案
答案 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秒