1.題目描述
Count the number of k's between 0 and n. k can be 0 - 9.
計算數字 k 在 0 到 n 中的出現的次數,k 可能是 0~9 的一個值。
2.樣例
樣例 1:
輸入: k = 1, n = 1 輸出: 1 解釋: 在 [0, 1] 中,我們發現 1 出現了 1 次 (1)。
樣例 2:
輸入:k = 1, n = 12 輸出:5 解釋:在 [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12] 中,我們發現 1 出現了 5 次 (1, 10, 11, 12)。
3.思路
- 計算出每一位上出現的次數然后累加求和;
- 對於個位出現的次數乘1,十位出現的次數乘10,百位乘100,依次類推;
- 對於k等於0分兩種情況討論;
- 對於k等於0且n小於10時直接輸出1;
- 對於k對於0且n大於10時由於最高位不可能出現0所以最后結果要減去最高位的次數;
4.具體情況分析
來自《編程之美》 :
假設有一個5位數N=ABCDE,我們現在來考慮百位上出現2的次數,即:從0到ABCDE的數中,有多少個數的百位上是2。分析完它,就可以用同樣的方法去計算個位,十位,千位,萬位等各個位上出現2的次數。
第一種情況:當百位上的數C小於2時:
1)當百位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個。
2)當百位C為1時,比如說12113。分析同上,並且和上面的情況一模一樣。最大也只能到11200~11299,所以百位出現2的次數也是1200個。
上面兩步綜合起來,可以得到以下結論:
—>當某一位的數字小於2時,那么該位出現2的次數為:更高位數字x當前位數
第二種情況:當百位上的數C等於2時:
當百位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時:
當百位C大於2時,比如說12313,那么固定低3位為200~299,高位依次可以從0到12,這一次就把12200~12299也包含了,同時也沒低位什么事情。因此出現2的次數是: (更高位數字+1)x當前位數。結論如下:
—>當某一位的數字大於2時,那么該位出現2的次數為:(更高位數字+1)x當前位數
通過上述分析,我們可以得到以下規律:
當某一位的數字小於i時,那么該位出現i的次數為:更高位數字x當前位數
當某一位的數字等於i時,那么該位出現i的次數為:更高位數字x當前位數+低位數字+1
當某一位的數字大於i時,那么該位出現i的次數為:(更高位數字+1)x當前位數
5.代碼展示
1 #include <iostream> 2 using namespace std; 3 4 //計算數字 k 在 0 到 n 中的出現的次數,k 可能是 0~9 的一個值。 5 class Solution{ 6 public: 7 int digtCounts(int k, int n){ 8 int i = 1; 9 int count = 0; 10 int current, high, low; 11 while(n / i != 0){ 12 current = n / i % 10; //記錄當前位大小 13 high = n / (i*10); //記錄高位大小 14 low = n - n / i * i; //記錄低位大小 15 if(current < k) 16 count += high * i; 17 if(k == current) 18 count += high * i + low + 1; 19 if(current > k) 20 count += (high + 1) * i; 21 i *= 10; 22 } 23 24 //特殊情況 25 if(k == 0 && n < 10){ 26 return 1; 27 } 28 if(k == 0 && n >= 10) 29 count -= i / 10; 30 31 return count; 32 } 33 }; 34 35 36 int main(){ 37 int k, n; 38 Solution s; 39 cin >> k >> n; 40 cout << s.digtCounts(k, n) << endl; 41 return 0; 42 }