📜  计算从 1 到 n 的数字为 4 的数字(1)

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

计算从 1 到 n 的数字为 4 的数字

在此题目中,我们需要计算从 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$。

有以下几种情况:

  1. 如果 $a_k$ < 4,则最高位为 3,其他位的数字可以任意取,因此有 $3 \times 9^{k-1}$ 种可能。
  2. 如果 $a_k$ = 4,则最高位为 4,其他位的数字可以任意取,因此有 $(x+1)$ 种可能。
  3. 如果 $a_k$ > 4,则最高位为 4,其他位的数字可以任意取,因此有 $4 \times 9^{k-1}$ 种可能。

代码示例:

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)。

对于大规模数据,第二种方法更为高效。