lc 233 数位上的1

十分位为例

以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
上一篇:算法之详解高精度加法【算法笔记】


下一篇:94年女程序员的日常饮食,虽然工资1万多,但是三餐还都自己做