【題目描述】
Count the number of k's between 0 and n. k can be 0 - 9.
計算數字k在0到n中的出現的次數,k可能是0~9的一個值。
【題目鏈接】
http://www.lintcode.com/en/problem/digit-counts/
【題目解析】
方法一: Brute Force, 0到n個數挨個算過去。最大的問題就是效率,當n非常大時,就需要很長的運行時間。
方法二:當某一位的數字小於i時,那麼該位出現i的次數爲:更高位數字x當前位數;當某一位的數字等於i時,那麼該位出現i的次數爲:更高位數字x當前位數+低位數字+1;當某一位的數字大於i時,那麼該位出現i的次數爲:(更高位數字+1)x當前位數
假設一個5位數N=abcde,我們現在來考慮百位上出現2的次數,即,從0到abcde的數中, 有多少個數的百位上是2。分析完它,就可以用同樣的方法去計算個位,十位,千位, 萬位等各個位上出現2的次數。
當百位c爲0時,比如說12013,0到12013中哪些數的百位會出現2?我們從小的數起, 200~299, 1200~1299, 2200~2299, … , 11200~11299, 也就是固定低3位爲200~299,然後高位依次從0到11,共12個。再往下12200~12299 已經大於12013,因此不再往下。所以,當百位爲0時,百位出現2的次數只由更高位決定, 等於更高位數字(12)x當前位數(100)=1200個。
當百位c爲1時,比如說12113。分析同上,並且和上面的情況一模一樣。 最大也只能到11200~11299,所以百位出現2的次數也是1200個。
上面兩步綜合起來,可以得到以下結論:
當某一位的數字小於2時,那麼該位出現2的次數爲:更高位數字x當前位數
當百位c爲2時,比如說12213。那麼,我們還是有200~299, 1200~1299, 2200~2299, … , 11200~11299這1200個數,他們的百位爲2。但同時,還有一部分12200~12213, 共14個(低位數字+1)。所以,當百位數字爲2時, 百位出現2的次數既受高位影響也受低位影響,結論如下:
當某一位的數字等於2時,那麼該位出現2的次數爲:更高位數字x當前位數+低位數字+1
當百位c大於2時,比如說12313,那麼固定低3位爲200~299,高位依次可以從0到12, 這一次就把12200~12299也包含了,同時也沒低位什麼事情。因此出現2的次數是: (更高位數字+1)x當前位數。結論如下:
當某一位的數字大於2時,那麼該位出現2的次數爲:(更高位數字+1)x當前位數
【參考答案】
http://www.jiuzhang.com/solutions/digit-counts/