[英]Given n, find how many n-digit numbers are there such that the number has prime digit at prime indices and is divisible by m?
[英]Given a number n, find out how many numbers have digit 2 in the range 0…n
這是一個面試問題。
給定數字n,找出0 ... n范圍內有數字2的數字
例如 ,
輸入= 13輸出= 2(2和12)
我給出了通常的O(n ^ 2)解決方案,但有更好的方法。
是否有任何“技巧”公式可以幫助我立即得到答案
計算沒有數字2的數字。在小於10 k的數字中,恰好有9 k 。 然后它仍然是將數字從10 k處理為n
,其中
10^k <= n < 10^(k+1)
你可以通過單獨處理第一個數字(案例2和其他必須區分),然后前兩個數字等來做。
例如,對於n = 2345
,我們發現有9^3 = 729
數字而沒有數字2低於1000.在1000到1999的范圍內再次有729個這樣的數字。然后在2000到2345的范圍內,有無,總共1458,因此包含數字2的數字是
2345 - 1458 = 887
參數'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;
}
給定數字ABCDEF,你可以計算范圍[0,F], [0,E9], [0,D99], [0,C999], [0,B9999]
和[0,A99999]
[0,F], [0,E9], [0,D99], [0,C999], [0,B9999]
中'2'的數量[0,A99999]
並添加它們。
然后對於范圍[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”,所以有(T+1)/10
“2層的在位置0, (T+1)/10
位於位置1等。總計, (T+1) * nines / 10
。
該解決方案的復雜性為O(logN)。
這就是我編寫初稿的方式(Python代碼)
def count2(n) :
return [p for p in range(n+1) if '2' in str(p)]
這將返回一個包含所含號碼的列表。
在性能方面它並沒有那么糟糕,因為n = 10,000,000,平均迭代需要大約5.5秒
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.