📌  相关文章
📜  计算从1到N的所有数字中的总置位位数|套装3(1)

📅  最后修改于: 2023-12-03 15:12:01.469000             🧑  作者: Mango

计算从1到N的所有数字中的总置位位数|套装3
问题描述

给定一个正整数N,求从1到N的所有数字中1出现的总位数。

举例说明

对于N = 12,数字1出现的总位数是5。

解题思路

我们可以从数字的每一位入手,统计每一位出现1的次数,然后将所有的次数加起来即可。假设N的位数是n,则对于第i位(从右往左数),它的出现次数为:

  • 如果第i位的数为0,出现次数为前面i-1位数字的取值范围×10^(i-1)。
  • 如果第i位的数为1,出现次数为前面i-1位数字的取值范围×10^(i-1)+右边数字的取值范围+1。
  • 如果第i位的数大于1,出现次数为(前面i-1位数字的取值范围+1)×10^(i-1)。

根据上面的分析,我们可以通过循环遍历每一位,计算当前位1出现的次数,并将所有次数加起来。具体实现可以参考下面的代码。

代码实现
def countDigitOne(n: int) -> int:
    if n <= 0:
        return 0
    res = 0
    m = 1
    while m <= n:
        a = n // m
        b = n % m
        # 计算当前位1出现的次数
        if a % 10 == 0:
            res += a // 10 * m
        elif a % 10 == 1:
            res += a // 10 * m + b + 1
        else:
            res += (a // 10 + 1) * m
        m *= 10
    return res
时间复杂度

由于我们只需要循环n的位数次,所以时间复杂度是O(logn)。

空间复杂度

只需要常数个变量,所以空间复杂度是O(1)。