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;
}
}
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;
}
}
相关文章推荐
- Leetcode 233. Number of Digit One (Medium) (cpp)
- 233. Number of Digit One
- [leetcode]233. Number of Digit One
- 233. Number of Digit One
- LeetCode Algorithms 233. Number of Digit One 题解
- [leetcode] 233. Number of Digit One
- [leetcode] 233. Number of Digit One 解题报告
- 【LeetCode】233. Number of Digit One
- 233. Number of Digit One
- [LeetCode]233. Number of Digit One
- Leetcode 233. Number of Digit One
- 233. Number of Digit One
- leetcode hard模式专杀之233. Number of Digit One
- [LeetCode]233. Number of Digit One
- Hard-题目26:233. Number of Digit One
- [Leetcode] 233. Number of Digit One 解题报告
- leetcode 233. Number of Digit One
- LeetCode 233. Number of Digit One
- leetcode No233. Number of Digit One
- leetcode 233. Number of Digit One