给定一个整数n,在所有不大于n的非负整数中,计算包含数字1的整数的个数。例如
这个问题最直观的方法就是累加1到n所有的包含1的数的个数。每个数通过循环取余10的方法判断是否包含1。但是这种思路效率并不高,数字n有
利用数字的规律,简化计算。以数字21567为例。先将数字分为两段:“1到1567”和“1568到21567”。
从1568到21567这段,分为两种情况,1出现在最高位的情况。从10000到19999的数字中,包含1的一共出现了
至于从1到1567利用递归就可以了。
class Solution {
private:
int numofOne(int n)
{
if(n == 0) return 0;
if(n > 0 && n < 10) return 1;
int a = n,cnt = 0,num1,num2,num3;
while(a/10)
{
a /=10;
cnt++;
}
if(a > 1)
num1 = pow(10,cnt);
else if(a == 1)
num1 = n%(int)pow(10,cnt)+1;
num2 = a * (cnt)*pow(10,cnt-1);
num3 = numofOne(n%(int)pow(10,cnt));
return num1+num2+num3;
}
public:
int countDigitOne(int n) {
return numofOne(n);
}
};
版权声明:本文为博主原创文章,未经博主允许不得转载。
Leetcode 233 Number of Digit One
原文地址:http://blog.csdn.net/jeanphorn/article/details/46801281