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

提示:

  • 如何计算数字的所有位数?
  • 使用取模运算符 (%) 来计算最后一位数字。
  • 推广取模运算符的思想来计算所有位数。

解题思路

这是一道简单的数学问题,主要考查数字位数的提取和基本运算。

解题思路:

我们需要提取整数 n 的每一位数字,然后分别计算这些数字的乘积和和,最后返回它们的差值。

核心方法:

  1. 使用取模运算 n % 10 获取最后一位数字
  2. 使用整除运算 n / 10 去掉最后一位数字
  3. 重复上述过程直到 n 变为 0

具体步骤:

  1. 初始化乘积 product = 1 和和 sum = 0
  2. n > 0 时:
    • 提取当前最后一位数字:digit = n % 10
    • 更新乘积:product *= digit
    • 更新和:sum += digit
    • 去掉最后一位:n /= 10
  3. 返回 product - sum

这种方法时间复杂度为 O(log n),其中 n 是输入数字(因为需要遍历所有位数),空间复杂度为 O(1)。

推荐解法: 直接模拟法,代码简洁清晰。

代码实现

class Solution {
public:
    int subtractProductAndSum(int n) {
        int product = 1;
        int sum = 0;
        
        while (n > 0) {
            int digit = n % 10;
            product *= digit;
            sum += digit;
            n /= 10;
        }
        
        return product - sum;
    }
};
class Solution:
    def subtractProductAndSum(self, n: int) -> int:
        product = 1
        sum_digits = 0
        
        while n > 0:
            digit = n % 10
            product *= digit
            sum_digits += digit
            n //= 10
        
        return product - sum_digits
public class Solution {
    public int SubtractProductAndSum(int n) {
        int product = 1;
        int sum = 0;
        
        while (n > 0) {
            int digit = n % 10;
            product *= digit;
            sum += digit;
            n /= 10;
        }
        
        return product - sum;
    }
}
/**
 * @param {number} n
 * @return {number}
 */
var subtractProductAndSum = function(n) {
    let product = 1;
    let sum = 0;
    
    while (n > 0) {
        let digit = n % 10;
        product *= digit;
        sum += digit;
        n = Math.floor(n / 10);
    }
    
    return product - sum;
};

复杂度分析

复杂度类型分析
时间复杂度O(log n),需要遍历输入数字的所有位数
空间复杂度O(1),只使用了常数级别的额外空间