题目描述:
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.
N的一般规律,比如N=abced五位数字的时候,我们分析百位c,有三种情况:
case 1: n=3141092, a= 31410, b=92. 计算百位上1的个数应该为 3141 *100 次.
case 2: n=3141192, a= 31411, b=92. 计算百位上1的个数应该为 3141 *100 + (92+1) 次.
所以就可以写出如下代码:
public class Solution {
public int countDigitOne(int n) {
long count = 0;
long factor = 1;
while (n / factor != 0) {
long lower = n % factor;
long cur = (n / factor) % 10;
long higher = n / (factor * 10);
if (cur < 2) {
count += higher * factor;
if (cur == 1) count += lower+1;
} else {
count += (higher+1) * factor;
}
factor *= 10;
}
return (int) count;
}
}