数组元素和与数字和的绝对差

标签: 数组 数学

难度: Easy

给你一个正整数数组 nums

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

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

注意:两个整数 xy 的绝对差定义为 |x - y|

示例 1:

输入:nums = [1,15,6,3]
输出:9
解释:
nums 的元素和是 1 + 15 + 6 + 3 = 25 。
nums 的数字和是 1 + 1 + 5 + 6 + 3 = 16 。
元素和与数字和的绝对差是 |25 - 16| = 9 。

示例 2:

输入:nums = [1,2,3,4]
输出:0
解释:
nums 的元素和是 1 + 2 + 3 + 4 = 10 。
nums 的数字和是 1 + 2 + 3 + 4 = 10 。
元素和与数字和的绝对差是 |10 - 10| = 0 。

提示:

  • 1 <= nums.length <= 2000
  • 1 <= nums[i] <= 2000

Submission

运行时间: 38 ms

内存: 16.3 MB

class Solution:
    def differenceOfSum(self, nums: List[int]) -> int:
        ans=0
        for i in nums:
            ans+=i 
            while i:
                ans-=i%10
                i//=10
        return ans

Explain

该题解通过遍历数组 `nums` 来计算元素和与数字和的绝对差。初始化一个累加器 `ans` 用于记录元素和与数字和的差。对于每个元素 `i`,首先将其加到 `ans` 中(处理元素和),然后通过一个 while 循环,不断取出 `i` 的最低位(`i%10`),从 `ans` 中减去这个最低位的值,并将 `i` 整除 10,以移除最低位。这样处理后,`ans` 存储的是当前总的元素和与数字和的差。循环结束后,返回 `ans` 的绝对值。

时间复杂度: O(n)

空间复杂度: O(1)

class Solution:
    def differenceOfSum(self, nums: List[int]) -> int:
        ans = 0  # 初始化差值累加器
        for i in nums:  # 遍历每个数字
            ans += i  # 加上整个数字到差值累加器
            while i:  # 提取并处理数字的每一位
                ans -= i % 10  # 从差值累加器中减去最低位
                i //= 10  # 移除数字的最低位
        return ans  # 返回累计的差值

Explore

这种处理方式是为了计算数字的整数值与其各个位上数字之和的差值。首先将整个数字加到累加器中,这代表了元素和的一部分。然后通过逐位减去每个数字的最低位,实际上是在计算元素的数字和。这样做的目的是将每个数字本身与其数字和进行比较,最终得到的累加器中的值,就是所有数字的元素和与数字和的差值。例如,对于数字 123,首先加123到累加器,然后分别减去3、2、1,最终累加器的值更新为123-(3+2+1)=117,即123与其数字和6的差值。

使用取模(%)和整除(//)操作来分割数字的位数是一种简单且有效的方法。取模操作能够直接得到数字的最低位(个位),而整除操作则可以移除这个最低位,从而使数字逐步减少位数,直至变为0。这种方法不需要额外的数据结构,且能够直接在原数字上操作,减少内存和时间的消耗,特别适合在需要逐位处理数字的场景。

尽管题解中的方法在理论上对于任何大小的数字都是适用的,但在实际应用中,处理极大的数字(如数百万位的数字)可能会面临性能和效率的问题。Python虽然可以处理任意长度的整数,但是大数的运算(尤其是逐位处理)会消耗大量的计算资源和时间。在这种情况下,可能需要考虑优化算法或者使用更高效的数学方法来处理大数,以保证程序的性能。