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 的每一位数字,然后分别计算这些数字的乘积和和,最后返回它们的差值。
核心方法:
- 使用取模运算
n % 10获取最后一位数字 - 使用整除运算
n / 10去掉最后一位数字 - 重复上述过程直到
n变为 0
具体步骤:
- 初始化乘积
product = 1和和sum = 0 - 当
n > 0时:- 提取当前最后一位数字:
digit = n % 10 - 更新乘积:
product *= digit - 更新和:
sum += digit - 去掉最后一位:
n /= 10
- 提取当前最后一位数字:
- 返回
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),只使用了常数级别的额外空间 |