【LeetCode】233. Number of Digit One

来源:互联网 发布:java nio网络编程 编辑:程序博客网 时间:2024/04/30 19:58

【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 + 14. m > 2, ans =  m * f(k - 1) + f(m % k) + k5. 例如求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;}};
0 0