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]
và [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).
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). –
Đó là một câu hỏi hoán vị .. –