1. 程式人生 > 其它 >1~n數字中1出現的個數

1~n數字中1出現的個數

1~n數字中1出現的個數

LeetCode

給定一個整數 n,計算所有小於等於 n 的非負整數中數字 1 出現的個數。

感覺挺有意思

對於一個數,我們先區域性分析一下,比如123456,我們考慮百位這個位置上,1出現的個數,對於100~199中,1可以出現100次,對於我們這個數,有123個這樣的迴圈,所以百位上的1有123 * 100,當然,這還不夠完全,我們還要考慮餘下的迴圈,也就是456這個數,對於這個數我們對100取餘,假設取餘結果為p

  • 當p < 100時,我們容易知道,百位上不會出現1,
  • 當p >= 100 & p < 200時,百位上應該有 p - 100 + 1個1出現
  • 當p >= 200時,明顯會把100個1全部出現

所以得到我們的公式

同理,我們可以得到其他位數上的1出現的和

typedef long long ll;
class Solution {
public:
    int countDigitOne(int n) {
        ll k = 1, res = 0;
        while(n >= k){
            res += (n / (k * 10)) * k + min(max(n % (k * 10) - k + 1, (ll)0), k);
            k *= 10;
        }
        return res;
    }
};