剑指Offer 43. 1~n整数中1出现的次数
输入一个整数 n ,求1~n这n个整数的十进制表示中1出现的次数。
例如,输入12,1~12这些整数中包含1 的数字有1、10、11和12,1一共出现了5次。
限制:
1 <= n < 2^31
思路:对每一次分别考虑:例如对abcdef这个数的c位进行考虑。首先取该位为1,那么ab可以取
,def可以取
,所以
,然后对c进行分类讨论
时,当ab取ab时,该位取不到1,所以此时解为0
时,当ab取ab时,该位取1,那么def只能取
,所以
时,当ab取ab时,该位取1,那么def可以取
,,所以
Java代码如下:
class Solution {
public int countDigitOne(int n) {
int res = 0;
List<Integer> list = new ArrayList<>();
while(n != 0) {
list.add(n % 10);
n /= 10;
}
for(int i = 0;i < list.size();i++) {
int left = 0, right = 0, t = 1;
for(int j = list.size() - 1;j > i;j--) {
left = left * 10 + list.get(j);
}
for(int j = i - 1;j >= 0;j--) {
right = right * 10 + list.get(j);
t *= 10;
}
res += left * t;
if(list.get(i) == 1) {
res += right + 1;
} else if(list.get(i) > 1) {
res += t;
}
}
return res;
}
}