Given an integer n, count the total number of digit 1 appearing in all non-negative integers less than or equal to n.
For example:
Given n = 13,
Return 6, because digit 1 occurred in the following numbers: 1, 10, 11, 12, 13.
題目只能通過尋找規律來實現。以2234爲列,我們可以分爲兩段計算,一段是1-234, 一段是235 - 2234,我們可以發現1-234其實求的是234前面的1的個數,也就是說我們可以遞歸的來求了。在求解235-2234的的1的個數時,1出現的地方分兩種情況,一個是出現在第一位,這種情況的話,要看第一位是不是1,如果第一位是1,那麼就可以是後面三位數字 +1;如果第一位不是1,那麼就是pow(10, len - 1); 這是1在第一位的情況,1在後面幾位的情況,我們可以用排列組合,可以知道其值爲: 第一位的值 * (len - 1) * pow(10, len - 2); 這樣分析之後,就可以快速的實現代碼了。
int countOne(string str)
{
int len = str.size();
if(len == 0 || (len == 1 && str[0] == '0'))
return 0;
if(len == 1 && str[0] != '0')
return 1;
string tmpstr = str.substr(1, str.size() - 1);
int numFirstDigit = 0;
if(str[0] == '1')
{
numFirstDigit = atoi(tmpstr.c_str()) + 1;
}
else if(str[0] > '1')
{
numFirstDigit = pow(10.0, len - 1);
}
int numOtherDigit = (str[0] - '0') * (len - 1) * pow(10.0, len - 2);
int numRecursive = countOne(tmpstr);
return numFirstDigit + numOtherDigit + numRecursive;
}
int countDigitOne(int n) {
if(n <= 0)
return 0;
return countOne(to_string(n));
}