Easy
题目描述
给你一个正整数数组 nums。
- 元素和 是
nums中的所有元素的和。 - 数字和 是
nums中每一个元素的每一数位(重复数位需多次累加)的和。
返回 元素和 与 数字和 的绝对差值。
**注意:**两个整数 x 和 y 的绝对差值定义为 |x - y|。
示例 1:
输入:nums = [1,15,6,3]
输出:9
解释:
nums 的元素和是 1 + 15 + 6 + 3 = 25 。
数字和是 1 + 1 + 5 + 6 + 3 = 16 。
元素和与数字和的绝对差值是 |25 - 16| = 9 。
示例 2:
输入:nums = [1,2,3,4]
输出:0
解释:
nums 的元素和是 1 + 2 + 3 + 4 = 10 。
数字和是 1 + 2 + 3 + 4 = 10 。
元素和与数字和的绝对差值是 |10 - 10| = 0 。
提示:
1 <= nums.length <= 20001 <= nums[i] <= 2000
解题思路
解题思路
这道题要求计算数组元素和与数字和的绝对差值。我们需要分别计算两个值:
- 元素和:直接将数组中所有元素相加
- 数字和:将每个元素拆分成数位,然后累加所有数位
核心思路
遍历数组中的每个元素:
- 将元素本身加到元素和中
- 将元素的每个数位加到数字和中
对于提取数字的每个数位,我们可以使用取模运算:
num % 10得到最低位数字num /= 10去掉最低位,继续处理剩余数位- 重复直到
num变为 0
最后返回两个和的绝对差值即可。
算法步骤
- 初始化
elementSum和digitSum为 0 - 遍历数组中的每个数字
num:- 将
num加到elementSum - 通过循环提取
num的每一位并加到digitSum
- 将
- 返回
|elementSum - digitSum|
时间复杂度为 O(n×k),其中 k 是数字的平均位数,空间复杂度为 O(1)。
代码实现
class Solution {
public:
int differenceOfSum(vector<int>& nums) {
int elementSum = 0, digitSum = 0;
for (int num : nums) {
elementSum += num;
while (num > 0) {
digitSum += num % 10;
num /= 10;
}
}
return abs(elementSum - digitSum);
}
};
class Solution:
def differenceOfSum(self, nums: List[int]) -> int:
element_sum = sum(nums)
digit_sum = 0
for num in nums:
while num > 0:
digit_sum += num % 10
num //= 10
return abs(element_sum - digit_sum)
public class Solution {
public int DifferenceOfSum(int[] nums) {
int elementSum = 0, digitSum = 0;
foreach (int num in nums) {
elementSum += num;
int temp = num;
while (temp > 0) {
digitSum += temp % 10;
temp /= 10;
}
}
return Math.Abs(elementSum - digitSum);
}
}
var differenceOfSum = function(nums) {
let elementSum = 0, digitSum = 0;
for (let num of nums) {
elementSum += num;
while (num > 0) {
digitSum += num % 10;
num = Math.floor(num / 10);
}
}
return Math.abs(elementSum - digitSum);
};
复杂度分析
| 复杂度类型 | 复杂度 | 说明 |
|---|---|---|
| 时间复杂度 | O(n × k) | n 是数组长度,k 是数字的平均位数(最多3位) |
| 空间复杂度 | O(1) | 只使用常数级别的额外空间 |