統計數字k在0~n內出現次數


1.題目描述

  Count the number of k's between 0 and nk 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 }

 




免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM