簡體   English   中英

給定數字n,找出0 ... n范圍內有數字2的數字

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM