十分位为例
以3465作为例子, 十位数上为1能出现几次?
分为两部分计算, 按3400 以下和以上单独讨论。
小于3400
3300 ~ 3399 里, 有10个1, 分别为3310, 3311, …, 3319
3200 ~ 3299里, 也有10个1,
0000 ~ 0099里也是10个1.
3400以上
如果是3415, 那只能有 3410 ~ 3415共6个数字
如果是3465, 则能有 3410 ~ 3419 共10个数字
百分位为例
以3465作为例子, 百位数上为1能出现几次?
分为两部分计算, 按2000 以下和以上单独讨论。
小于3000
2000 ~ 2999 里, 有100个1, 分别为2100 ~ 2199
1000 ~ 1999 里,也有100个1
0000 ~ 0999里也是.
3000以上
3000以上时,只有31xx能让百分位为1,能取3100~3199, 所以有100个.
泛化
对于数字xn, xn-1, …, x1, 问第i位上为1几次?
把数字看做xn, xn-1, …xi+1, xi, xi-1, …, x1三个部分
则分别讨论xn, … xi+1, 0, … 0以下的数, 和以上的数即可.
答案
所以对于每个位, 都按照
class Solution:
def countDigitOne(self, n: int) -> int:
res = 0;
cnt = 1;
div = 1
while n / div > 0:
cnt = 0
i = (n // div) % 10
res += (n // (div * 10)) * div
if i == 1:
res += n % div + 1
elif i > 1:
res += div
div *= 10;
return res