问题描述(来源于LeetCode)

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

代码实现

1
2
3
4
5
6
7
8
9
10
11
class Solution:
def subtractProductAndSum(self, n: int) -> int:
x=0
sums=0
pro=1
while n:
x=n%10
sums += x
pro *= x
n =n // 10
return pro -sums

题目理解

题目要求计算一个整数的各位数字之积与各位数字之和的差值。例如,对于整数 234:

  • 各位数字之积:2 × 3 × 4 = 24

  • 各位数字之和:2 + 3 + 4 = 9

  • 差值:24 - 9 = 15

代码分析

算法思路

代码采用循环分解整数的方法:

  1. 初始化变量:

    • sums 用于存储各位数字之和,初始化为 0

    • pro 用于存储各位数字之积,初始化为 1

  2. 使用 while 循环分解整数 n

    • 每次取 n 的个位数(n % 10

    • 将该数字加到 sums 中

    • 将该数字乘到 pro 中

    • 将 n 除以 10(整数除法)以处理下一位

  3. 循环直到 n 变为 0

  4. 返回 pro - sums

时间复杂度分析

  • 时间复杂度:O(logN)O(log N)

    • 循环次数等于数字 n 的位数

    • 对于十进制数,位数约为logNlogN

  • 空间复杂度:O(1)O(1)

    • 只使用了常数级别的额外空间

代码正确性

代码逻辑正确,能够正确处理各种情况:

  • 处理了正整数

  • 正确处理了数字 0 的情况(当 n=0 时,循环不执行,返回 1-0=1,但实际应为 0;不过题目保证 n≥1)

  • 注意:当 n=0 时,代码会返回 1,但题目约束 n≥1,所以没有问题

边界情况考虑

  1. 个位数:如 n=5,积为5,和为5,差为0

  2. 包含0的数字:如 n=102,积为0,和为3,差为-3