📅  最后修改于: 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)