您的位置:首页 > 其它

233. Number of Digit One

2018-02-12 21:33 120 查看
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的所有正数中出现1的个数。
分析:
容易分析可得,n = 9, 99, 999, 999....对应出现1的次数可用 Ci = 10*Ci-1 + pow(10, sizeof(n) - 1)。
1、假设n = abcd四位数,则可将数字拆分为0~(a-1)999,a000 ~ abcd两部分,对于第一部分,可直接通过Ci计算得到;
2、判断a是否大于1,如果a > 1,则a000~abcd之间会出现1000~1999这些数字,需要增加pow(10, sizeof(n) - 1)个1;如果a == 1,则需要增加bcd个1;
3、将a000~abcd减去a000,得到0~bcd区间;
4、重复上述过程。
程序如下所示:class Solution {
public int countDigitOne(int n) {
int num = 0;
while (n >= 10){
int size = getNumSize(n);
int index = (int)Math.pow(10, size - 1);
int firstNum = n/index;
num += firstNum*count(index - 1);
num += (firstNum > 1)?index:(n - index + 1);
n = n - firstNum*index;
}
if (n >= 1){
return num+1;
}
return num;
}

public int getNumSize(int n){
int size = 0;
while (n != 0){
size ++;
n = n/10;
}
return size;
}

public int count(int n){
int val = 9;
int cnt = 1, index = 10;
while (val != n){
cnt = 10*cnt + index;
val = val*10 + 9;
index = 10*index;
}
return cnt;
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: