1~n數字中1出現的個數
阿新 • • 發佈:2021-08-13
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; } };