2012-06-22 38 views
14

Đó là một câu hỏi phỏng vấn.Cho số n, tìm hiểu xem có bao nhiêu số có chữ số 2 trong khoảng 0 ... n

Cho một số n, tìm hiểu có bao nhiêu số có chữ số 2 trong khoảng 0 ... n

Ví dụ,

input = 13 output = 2 (2 và 12)

Tôi đã đưa ra giải pháp O (n^2) thông thường nhưng có cách tiếp cận tốt hơn.

là có bất kỳ công thức 'lừa' rằng sẽ giúp tôi để có được câu trả lời ngay lập tức

+8

O (n²)? Nếu bạn muốn nói, hãy tạo ra các con số và kiểm tra các chữ số, đó là O (n lg n), vì mỗi số n được biểu thị bằng các chữ số O (lg n). –

+0

Đó là một câu hỏi hoán vị .. –

Trả lời

26

Đếm những con số mà làm không có chữ số 2. Trong số những con số ít hơn 10 k, có chính xác 9 k trong số đó. Sau đó, nó vẫn đối xử với những con số từ 10 k-n, nơi

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

mà bạn có thể làm bằng cách xử lý các chữ số đầu tiên cá nhân (trường hợp 2 và những người khác phải được phân biệt), và sau đó là 2 đầu tiên các chữ số vv

Ví dụ: đối với n = 2345, chúng tôi thấy có 9^3 = 729 số không có chữ số 2 dưới 1000. Có 729 số đó trong khoảng từ 1000 đến 1999. Sau đó trong phạm vi từ 2000 đến 2345, ở đó là không, với tổng số 1458, do đó các số có chứa chữ số 2 là

2345 - 1458 = 887 
+0

Bạn có thể giải thích làm thế nào bạn có 9^k số, tôi không phải là rất tốt với tổ hợp. – nikhil

+4

Nếu bạn viết các số có số 0 đứng đầu, các số từ 0 đến '10^k - 1' chính là số bạn có thể viết chính xác với chữ số' k'. Đối với mỗi chữ số, có 9 ('== 10 - 1') lựa chọn có thể (' 0,1,3,4,5,6,7,8,9'). Các lựa chọn là độc lập, vì vậy tổng số lựa chọn là sản phẩm của số lượng lựa chọn cho mỗi chữ số, '9 * 9 * ... * 9 = 9^k'. Nếu bạn là những con số không chứa chữ số 2 cũng không phải là chữ số 5, nó sẽ là '8^k' (8 = 10 - 2). Nguyên tắc tương tự giữ cho các đại diện của các số trong các căn cứ khác. Tuy nhiên, vì các con số không thực sự có số 0 đứng đầu, tiếp ... –

+1

..., cấm chữ số 0 hơi khác một chút. Sau đó, bạn không thể thêm số 0 đứng đầu để có được tất cả các số có cùng độ dài và số lượng các số bên dưới '10^k' không có chữ số 0 là' 9^1 + 9^2 + 9^3 + ... + 9^k = 9 * (9^k - 1)/8'. Nếu bạn cấm 0 và 'd' các chữ số khác, để lại các chữ số đủ điều kiện' e = 9-d', bạn sẽ nhận được 'e^1 + e^2 + ... + e^k = e * (e^k - 1)/(e-1) '. (Thay thế 9 bằng 'base-1' cho các căn cứ không phải là 10.) –

0

Cho số có chữ số ABCDEF bạn có thể đếm số '2 trong phạm vi [0,F], [0,E9], [0,D99], [0,C999], [0,B9999][0,A99999] và thêm chúng.

Sau đó, trong phạm vi [0, X9999...999], số đầu T = X9999...999 có thể được viết là (X+1) * 10<sup>nines</sup> -1.

Số 'của 2 trong phạm vi đó là:

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

Đó là: nếu X >= 2, phần của số đó có một '2' tại nines vị trí + 1 là 1/(X+1), Hiện có (T+1)/(X+1) '2 tại vị trí đó. Nếu X < 2, thì không có số nào trên [0..T] có dấu '2' ở vị trí đó.

Đối với các vị trí chữ số khác, rất dễ dàng để thấy rằng tại mỗi vị trí chữ số, 1/10 của những con số có một '2', vì vậy có (T+1)/10 '2 tại vị trí 0, (T+1)/10' 2 tại vị trí 1, vv Trong tổng số, (T+1) * nines/10.

Độ phức tạp của giải pháp này là O (logN).

0

này là thế nào tôi sẽ đi về mã hóa dự thảo (mã Python) đầu tiên của tôi

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

và điều đó sẽ trả lại cho bạn một danh sách với số lượng chứa.

Xét về hiệu suất nó không phải là xấu, cho n = 10.000.000 một lần lặp trung bình mất khoảng 5,5 giây

1

luận 'chữ số' là một mà chúng tôi muốn đếm và arg 'số' là đến nơi chúng tôi muốn đếm. Ví dụ: Nếu chúng ta muốn đếm số lần xuất hiện của '1', từ 0 đến 12, hãy gọi hàm có chữ số = 1 và số = 12, và nó sẽ trả về số lần xuất hiện của '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; 
} 
+0

Giải thích bằng một số giải thích .. – Sankarann

+0

countOccurrences (1,20) = 3; // sai – SMUsamaShah

+0

Bạn đã thử thực hiện phương pháp này chưa? Nó trả về 12, trên countOccurrences (1,20), không phải 3. – undeadlock

Các vấn đề liên quan