📜  链表的节点总和,其包含正好具有三个因子的值(1)

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

链表的节点总和,其包含正好具有三个因子的值

简介

给定一个链表,求节点值的总和,其中节点值正好包含三个因子的值。

本题要求返回节点值为正整数,且其包含三个因子的值的所有节点的值的总和。例如,节点值为 162,包含因子 2、3、27,因此它是一个符合条件的节点。如果链表中的所有节点均不符合条件,则返回 0。

实现思路
  1. 定义一个变量 sum 用于记录累加和,初始化为 0。
  2. 遍历链表,对于每个节点,判断其节点值是否满足条件。如果满足条件,则将节点值累加到 sum 中。
  3. 判断链表遍历结束后的 sum 是否为 0,如果是则返回 0,否则返回 sum。
判断节点值是否满足条件

对于一个正整数 n,如果其能够分解为以下形式:

$$ n = 2^a \times 3^b \times 5^c \times \cdots $$

这里 a、b、c 等是整数且均为非负整数,且不存在其他质数因子,则称 n 是一个三个因子的数。

该问题可以通过以下两个步骤解决:

  1. 将给定的正整数 n 分解质因数,得到它的质因数分解式。
  2. 判断 n 是否为一个三个因子的数。

步骤 1 可以通过以下两种方法实现:

  • 暴力枚举法:对于每个正整数,从 2 开始遍历直到$\sqrt{n}$,判断每一个质数是否能够整除 n。
  • 质因数分解法:借助质因数分解的算法,将 n 分解为它的质因数乘积的形式。

步骤 2 可以通过以下方式实现:

根据第一步分解得到的质因数分解式,统计其中因子数为 2、3 和其他数的个数,如果因子数为 2 、3 的个数都大于 0,而且没有其他因子,则该数为一个三个因子的数。

代码实现

以下给出 Python 3 代码实现,链表节点定义为 ListNode 类型。

class ListNode:
    def __init__(self, val=0, next=None):
        self.val = val
        self.next = next

def sum_of_nodes_with_three_factors(head: ListNode) -> int:
    def is_three_factors_num(n: int) -> bool:
        primes = [2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97]
        factors = [0] * len(primes)
        for i, p in enumerate(primes):
            while n % p == 0:
                n //= p
                factors[i] += 1
            if n == 1:
                break
        if n > 1:
            return False
        return factors.count(2) >= 1 and factors.count(3) >= 1 and factors.count(1) == len(primes) - factors.count(2) - factors.count(3)

    sum = 0
    while head:
        if is_three_factors_num(head.val):
            sum += head.val
        head = head.next
    return sum if sum != 0 else 0
时间复杂度

对于 n 个节点的链表,需要对每个节点进行判断,所以时间复杂度为 O(n)。在判断一个数字是否为三个因子的数时,使用了质因数分解算法,时间复杂度为 O(logn),其中 n 表示数字的大小。

空间复杂度

需要使用 $O(1)$ 的额外空间来存储 sum,以及一个存储质因数分解结果的数组。由于质因数个数是常数级别的,因此空间复杂度仍然为 $O(1)$。