Easy

题目描述

给你一个正整数数组 nums

  • 元素和nums 中的所有元素的和。
  • 数字和nums 中每一个元素的每一数位(重复数位需多次累加)的和。

返回 元素和数字和 的绝对差值。

**注意:**两个整数 xy 的绝对差值定义为 |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 <= 2000
  • 1 <= nums[i] <= 2000

解题思路

解题思路

这道题要求计算数组元素和与数字和的绝对差值。我们需要分别计算两个值:

  1. 元素和:直接将数组中所有元素相加
  2. 数字和:将每个元素拆分成数位,然后累加所有数位

核心思路

遍历数组中的每个元素:

  • 将元素本身加到元素和中
  • 将元素的每个数位加到数字和中

对于提取数字的每个数位,我们可以使用取模运算:

  • num % 10 得到最低位数字
  • num /= 10 去掉最低位,继续处理剩余数位
  • 重复直到 num 变为 0

最后返回两个和的绝对差值即可。

算法步骤

  1. 初始化 elementSumdigitSum 为 0
  2. 遍历数组中的每个数字 num
    • num 加到 elementSum
    • 通过循环提取 num 的每一位并加到 digitSum
  3. 返回 |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)只使用常数级别的额外空间

相关题目