📌  相关文章
📜  查找小于或等于N且具有奇数位数的正整数的数量(1)

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

题目描述

给定一个正整数N,编写一个函数来计算小于或等于N且具有奇数位数的正整数的数量。

示例

输入:N = 10

输出:5

解释:小于10的具有奇数位数的正整数为[1, 3, 5, 7, 9],数量为5。

解题思路

题目可以转化为统计N的奇数位数的数字数量,由于本题N <= 10^9,枚举每个数字的奇偶性会超时,因此可以考虑使用数学方法快速计算。

可以通过数字长度的奇偶性来计算小于该位数数字的数量,当数字长度为偶数时,所有的偶数位数字都可以从0~9中选择,而奇数位数字可以从1~9中选择;当数字长度为奇数时,所有的奇数位数字和偶数位数字都可以从0~9中选择。因此,可以按照N的奇偶性将N的位数分为两类来计算小于N的奇数位数数字的数量。

代码实现
def countNums(n: int) -> int:
    if n < 10:
        return 1 if n % 2 == 1 else 0
    strN = str(n)
    count, size = 0, len(strN)
    # 计算奇数位数的数字数量
    for i in range(1, size, 2):
        count += 9 * pow(10, (i - 1) // 2)
    # 计算偶数位数的数字数量
    if size % 2 == 0:
        count += pow(10, size // 2) - pow(10, size // 2 - 1)
    else:
        count += pow(10, size // 2 + 1) - pow(10, size // 2)
    return count if n % 2 == 1 else count - pow(10, size // 2)
复杂度分析
  • 时间复杂度:$O(logN)$,N的位数为logN,则根据循环次数可知总时间复杂度为O(logN)。
  • 空间复杂度:$O(logN)$,需要一个长度为logN的字符串,和两个变量count和size。