📌  相关文章
📜  2的出现次数(从0到n的数字)(1)

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

统计从0到n中2的出现次数

在计算机编程中,常常需要对数字进行统计。例如,求从0到n(n为正整数)中数字2出现的次数。本文将介绍这个问题的解法,并提供相应的Python代码。

问题描述

给定一个正整数n,统计从0到n中数字2出现的次数。

解法

一种单纯的方法是,遍历从0到n中的每一个数字,然后判断其包含多少个数字2。这个方法的时间复杂度为O(nlogn),会随着n值的增加而变得非常慢。

更好的方法是,直接统计数字的出现次数。我们可以将数字按位读取,然后逐位统计数字2的出现次数。具体来说,我们可以考虑以下四种情况:

  • 当前位的数字小于2时,不会产生进位,因此2的出现次数为高位数字Multi * 当前位数Digit;
  • 当前位的数字等于2时,高位数字产生的进位对2的出现次数有一部分贡献。假设高位数字为Left,低位数字为Right,则2的出现次数为Left * Digit + Right + 1;
  • 当前位的数字大于2时,当前位会产生一个进位,此时2的出现次数为(Left + 1) * Digit;
  • 当前位的数字为0时,当前位不会对2的出现次数产生贡献。

例如,对于数字100,在百位上的数字是1,百位以上的数字为0,百位以下的数字为0,我们可以统计百位上数字2的出现次数为1 * 100 = 100。而对于数字202,在百位上的数字是2,百位以上的数字为0,百位以下的数字为2,我们可以统计百位上数字2的出现次数为1 * 100 + 2 + 1 = 103。

代码实现

下面是Python实现的代码。其中,计算高位数字Left和低位数字Right可以通过整除和求余操作得到。

def count_twos(n: int) -> int:
    count = 0
    digit = 1
    while digit <= n:
        left = n // (digit * 10)
        right = n % digit
        curr = (n // digit) % 10
        if curr == 2:
            count += left * digit + right + 1
        elif curr > 2:
            count += (left + 1) * digit
        else:
            count += left * digit
        digit *= 10
    return count
总结

本文介绍了从0到n中数字2出现次数的计算方法,并提供了Python的实现。这个问题的时间复杂度为O(logn),可以在较短的时间内得到结果。