📌  相关文章
📜  反转每个元素后数组元素的总和(1)

📅  最后修改于: 2023-12-03 15:37:07.621000             🧑  作者: Mango

反转每个元素后数组元素的总和

题目描述

给定一个整数类型的数组 nums ,请将数组中每个元素按照它们反转后的值求和。

具体来说,如果输入数组 nums = [12,345,2,6,7896],则输出结果为 79017,计算过程为:

  • 12 反转后为 21 ,其值为 21。
  • 345 反转后为 543 ,其值为 543。
  • 2 反转后为 2 ,其值为 2。
  • 6 反转后为 6 ,其值为 6。
  • 7896 反转后为 6987 ,其值为 6987。

因此,总和为 21 + 543 + 2 + 6 + 6987 = 79017。

解法

首先可以想到将数字转换为字符串,然后将每个字符串反转,然后再转换回数字,并且求和。

class Solution:
    def reverse(self, x: int) -> int:
        ans = 0
        neg = 1
        if x < 0:
            neg = -1
            x = -x
        while x > 0:
            ans = ans * 10 + x % 10
            x //= 10
        if ans * neg > 2 ** 31 - 1 or ans * neg < -2 ** 31:
            return 0
        return ans * neg

    def reverseSum(self, nums: List[int]) -> int:
        res = 0
        for num in nums:
            res += self.reverse(num)
        return res

以上代码中,我们首先定义了一个变量 ans,来存储反转后的结果。其中对于每个数字,我们通过取余操作得到最后一位数字,然后将 ans 的值乘 10 并加上该数字,相当于原数值左移一位并加上 x 的最后一位数字。然后我们将 x 除以 10 进行一位的删除,并在 ans 的基础上继续进行操作。

由于值可能会超过 32 位有符号整数的范围,因此我们要在计算之前进行判断,防止出现溢出的情况。

最后将每个反转后的值累加起来,便是最终结果。

复杂度分析
  • 时间复杂度:$O(n\log n)$,其中 n 为数组 nums 的长度,最坏情况下每个元素都需要反转,反转的时间复杂度为 $O(\log x)$,而 $x$ 表示元素的大小。
  • 空间复杂度:$O(1)$,我们没有使用额外的数据结构。

完整代码如下:

class Solution:
    def reverse(self, x: int) -> int:
        ans = 0
        neg = 1
        if x < 0:
            neg = -1
            x = -x
        while x > 0:
            ans = ans * 10 + x % 10
            x //= 10
        if ans * neg > 2 ** 31 - 1 or ans * neg < -2 ** 31:
            return 0
        return ans * neg

    def reverseSum(self, nums: List[int]) -> int:
        res = 0
        for num in nums:
            res += self.reverse(num)
        return res