📅  最后修改于: 2023-12-03 15:27:58.957000             🧑  作者: Mango
在此题目中,我们需要计算从 1 到 n 的数字中有多少个数字包含数字 4。
一个比较直接的思路是,对于每个数字都进行判断是否包含数字 4,再累加数量。
代码示例:
def count_four(n: int) -> int:
count = 0
for i in range(1, n+1):
if '4' in str(i):
count += 1
return count
但是这种方法的时间复杂度为 O(nlogn),有没有更快的方法呢?
我们可以通过找规律来优化算法。
首先,我们可以观察到,从 1 到 9 中,只有一个数字包含数字 4,即 4。这意味着,对于一个以 4 开头的数字,它的后面可以随意添加数字,都一定包含数字 4。
例如,数字 40、41、42、43、44 等都包含数字 4。
因此,我们可以将数字 n 拆分成两部分,即最高位和其他位。设数字 n 的位数为 k,则最高位为 $a_k$,其他位的数字为 $x$。
有以下几种情况:
代码示例:
def count_four(n: int) -> int:
if n < 4:
return 0
count = 0
k = len(str(n)) # 数字 n 的位数
for i in range(1, k):
count += 3 * 9**(i-1)
x = int(str(n)[1:])
if str(n)[0] == '4':
count += (x + 1)
elif str(n)[0] > '4':
count += 4 * 9**(k-1)
return count
在本题中,我们介绍了两种方法来计算从 1 到 n 的数字中包含数字 4 的个数。
第一种方法是直接遍历每个数字并判断,时间复杂度为 O(nlogn)。
第二种方法是根据规律进行计算,时间复杂度为 O(logn)。
对于大规模数据,第二种方法更为高效。