面試100 25從1到n正數(shù)中1出現(xiàn)的次數(shù)
25從1到n正數(shù)中1出現(xiàn)的次數(shù)
一問題描述:
求1到n中,十進制數(shù)中,1出現(xiàn)的次數(shù)總和
方法1
對每一個數(shù)x,x先與10取余,然后判斷x/10之后,是否為0,不為0則繼續(xù)上述操作
復雜度為o(n)
方法2:
此題不要以為是重復計數(shù),必須要重復計數(shù),,因為100001 ,這個數(shù)字,需要記兩次,一次首位為1,另一次不計首位,后幾位為1.
這樣的話,就有重復計數(shù)的問題了,但是本題求的是含有1的個數(shù),所以需要被重復計數(shù)。
使用遞歸21345
則需要對21345的每一個10進制位,進行遞歸計算。對萬位,千位,百位,十位,個位
即首位不為0,則可以分別計算21345 1345 345 45 5
1-20000
20001-21000
21001-21300
21301-21340
21341-21345
(1) 當首位最高位為1時,含有1的個數(shù)為 10000
首位可以為0 , 1 ,則后四位其中有1位為1的個數(shù)為 ,2* 10(3)*4 = 8000 合計18000
(2) 下面計算1345
首位為1,則為 346
其余位為 (首位可以為0) 3 * 10(2) = 30 合計376
(3)下面計算345
首位為1 10的2次方
首位可以為(0 1 2) 等于3的情況, 3 * 2 *10 合計160
剩下的循環(huán)即求300- 345
(4)下面計算45
首位為1, 10的1次方
首位不計,首位可以取(0 1 2 3) 4 * 1 合計 14
(5)下面計算5
判斷長度小于1,直接返回
擴展3 :
求1到n中任意進制的數(shù)的個數(shù),遞歸公式如下:
總結對于任意的1到n,求所給定的字符c的個數(shù)
s = abcdefgh , m = len(abcdefgh)
(1)當首位等于*s = c時 ,Q(abcdefgh) = abcdefgh + 1 + (*s-'0')*(m-1)*10^(m-2) + Q(bcdefgh)
(2)當首位為 *s > c 時 ,Q(abcdefgh) = 10^(m-1) + (*s - '0') * (m-1) *10^(m-2) + Q(bcdefgh)
(3)當首位為*s < c時, Q(abcdefgh) = (*s - '0') * (m-1) *10^(m-2) + Q(bcdefgh)
三 代碼如下:














































































