您的位置:首页 > 其它

Leetcode181:Number of Digit One

2015-12-05 13:34 465 查看
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.

很显然,我们可以按照位一个一个找,即在个位、十位、百位。。。出现过的1。

现在直接给出N的一般规律,比如N=abced五位数字的时候,我们分析百位c,有三种情况:

1)c == 0的时候,比如12013,此时百位出现1的是:00 100 ~ 00 199, 01 100~01 199,……,11 100~ 11 199,共1200个,显然这个有高位数字决定,并且受当前位数影响;

2)c == 1的时候,比如12113,此时百位出现1的肯定包括c=0的情况,另外还需要考虑低位的情况即:00100 ~ 00113共114个,

3)c >= 2的时候,比如12213,此时百位出现1的是:00 100 ~ 00 199, 01 100~01 199,……,11 100~ 11 199,12 100 ~ 12 199,共1300个,这个有高位数字决定,其实是加一,并且乘以当前位数
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;
}
};
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: