您的位置:首页 > 其它

【LeetCode】233. Number of Digit One

2017-04-03 15:35 260 查看

【LeetCode】233. Number of Digit One

【题目描述】

  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.



【输入输出】

  13 -> 6



【解题思路】

 
1. 观察可知,f(9)=1, f(99)=20, f(999)=300, ...
2. 对于n上的任意位m,k表示其位数,1表示个位,10表示十位,以此类推
3. m <= 1, ans = m * f(k - 1) + f(m % k) + m % k + 1
4. m > 2, ans =  m * f(k - 1) + f(m % k) + k
5. 例如求f(514)=5*f(99)+100+f(14)=200+f(14)=200+1*f(9)+4+1+f(4)=206+f(4)=207




【代码】

class Solution {
public:
int countDigitOne(int n) {
double kk = 1, ans = 0;
int k = 1, inter, c = 0;
while (n / (int)kk != 0) { kk *= 10; c++; }
k = (int)(kk / 10);
inter = (int)((c * kk / 10 - k) / 10);
while (n >= 10) {
if (n / k == 1) ans += (inter + n % k + 1);
else ans += (inter * (n / k) + k);
n %= k;
while (k != 0 && n / k == 0) {
k /= 10;
inter = (inter - k) / 10;
}
}
ans += ((n <= 0) ? 0 : 1);
return ans;
}
};
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  leetcode