整数的各位积和之差

标签: 数学

难度: Easy

给你一个整数 n,请你帮忙计算并返回该整数「各位数字之积」与「各位数字之和」的差。

示例 1:

输入:n = 234
输出:15 
解释:
各位数之积 = 2 * 3 * 4 = 24 
各位数之和 = 2 + 3 + 4 = 9 
结果 = 24 - 9 = 15

示例 2:

输入:n = 4421
输出:21
解释: 
各位数之积 = 4 * 4 * 2 * 1 = 32 
各位数之和 = 4 + 4 + 2 + 1 = 11 
结果 = 32 - 11 = 21

提示:

  • 1 <= n <= 10^5

Submission

运行时间: 19 ms

内存: 16.1 MB

class Solution:
    def subtractProductAndSum(self, n: int) -> int:
        lists = [int(x) for x in str(n)]
        num = reduce(lambda x, y:x * y, lists) - sum(lists)
        return num

Explain

此题解首先将整数n转换为字符串,然后对每个字符进行转换,得到一个包含n的每个数字的列表。接着,使用reduce函数计算所有数字的乘积,并使用内置的sum函数计算所有数字的和。最后,计算这两个值的差并返回。

时间复杂度: O(d)

空间复杂度: O(d)

# 定义解决方案类
class Solution:
    def subtractProductAndSum(self, n: int) -> int:
        # 将整数n转换为字符串,然后转换每个字符为整数,并存储在列表中
        lists = [int(x) for x in str(n)]
        # 使用reduce函数计算列表中所有数字的乘积,然后计算所有数字的和,并计算这两个结果的差
        num = reduce(lambda x, y: x * y, lists) - sum(lists)
        # 返回计算得到的差
        return num

Explore

使用字符串转换的方法主要是为了简化各位数字的提取过程。通过将整数转换为字符串,可以直接迭代字符串中的每个字符,并轻松地将其转换为整数以进行后续计算。这种方法在代码编写上更直观、容易理解,并且易于实现。相比之下,使用数学运算(如重复使用除法和取余操作)来直接处理数字虽然避免了类型转换,但代码可能不如转换为字符串那样直观易懂。

使用 lambda 表达式和 reduce 函数可以提供一种简洁的方式来处理列表元素的累积操作,如乘积。然而,这种方法在效率上通常不如直接使用循环,因为 lambda 表达式可能会引入额外的调用开销,而 reduce 函数需要处理函数调用的堆栈。直接使用循环可以更有效地利用局部变量和简化操作,通常会有更好的性能表现。

如果数字 n 中包含 0,使用 reduce 函数计算乘积将会得到 0,因为任何数与 0 相乘都是 0。这将直接影响最终的输出,因为乘积部分为 0,最终结果将仅由 -sum(lists) 决定,即所有数字的和的负值。这是因为 0 的存在使得乘积结果失去了其它数字的贡献。

对于 n 的最大值 10^5,该数字最多有 6 位。在这种情况下,算法需要处理一个包含 6 个数字的列表。计算这个列表的乘积和和是非常快的,因为只有 6 个元素,无论是乘法操作还是加法操作,计算量都很小。因此,即使在 n 达到其最大限度时,该算法的运行时间也可以接受,主要的时间消耗来自于字符串转换和列表操作,但这在处理 6 个元素时仍然是高效的。