求出加密整数的和

标签: 数组 数学

难度: Easy

给你一个整数数组 nums ,数组中的元素都是  整数。定义一个加密函数 encrypt ,encrypt(x) 将一个整数 x 中 每一个 数位都用 x 中的 最大 数位替换。比方说 encrypt(523) = 555 且 encrypt(213) = 333 。

请你返回数组中所有元素加密后的  。

示例 1:

输入:nums = [1,2,3]

输出:6

解释:加密后的元素位 [1,2,3] 。加密元素的和为 1 + 2 + 3 == 6 。

示例 2:

输入:nums = [10,21,31]

输出:66

解释:加密后的元素为 [11,22,33] 。加密元素的和为 11 + 22 + 33 == 66

提示:

  • 1 <= nums.length <= 50
  • 1 <= nums[i] <= 1000

Submission

运行时间: 27 ms

内存: 16.1 MB

class Solution:
    def sumOfEncryptedInt(self, nums: List[int]) -> int:
        def en(x):
            xx = str(x)
            xxx = max(xx)
            xxxx = [xxx for _ in xx]
            return int(''.join(xxxx))
        
        return sum([en(x) for x in nums])

Explain

这道题目的解法是通过定义一个加密函数`en`,该函数接收一个整数`x`,将其转换为字符串`xx`,然后找出`xx`中的最大数字`xxx`,并用`xxx`替换`xx`中的每个数字,最后将得到的字符串`xxxx`转换回整数并返回。解法的主体部分是对输入数组`nums`中的每个元素应用`en`函数,并将结果相加返回。

时间复杂度: O(n)

空间复杂度: O(1)

class Solution:
    def sumOfEncryptedInt(self, nums: List[int]) -> int:
        # 定义加密函数
        def en(x):
            xx = str(x)  # 将整数转换为字符串
            xxx = max(xx)  # 找到字符串中的最大数字
            xxxx = [xxx for _ in xx]  # 用最大数字替换所有数字
            return int(''.join(xxxx))  # 将替换后的字符串转换回整数
        
        # 对数组中的每个元素应用加密函数并求和
        return sum([en(x) for x in nums])

Explore

将整数转换为字符串是为了便于访问和操作每一位数字。在数学运算中,处理数字的每一位相对复杂,涉及到循环和除以10的操作来分离每一位。而字符串提供了直接访问每个字符的简单方法,且可直接使用内置函数如`max`来找出最大的字符。因此,使用字符串处理在这种情况下更直观且易于实现。

函数`en`中使用`max(xx)`来找最大数字在所有情况下都是有效的。即使数字的字符串表示以0开头,`max`函数仍然正确地返回字符串中的最大数字。由于`max`函数是按字符的ASCII值进行比较的,数字字符'0'到'9'的ASCII值是连续的,并且'0'是最小的,所以即使是以'0'开头的数字,`max`也能正确找到最大的数字字符。

在`en`函数中,将整个字符串的每个字符替换为最大值后再转换回整数通常不会超出Python中整数的范围。Python的整数类型是动态的,可以处理非常大的数值,只受限于系统的内存。即使将字符串中的每个字符都替换为'9'(最大的单个数字字符),形成的新字符串所代表的整数值在绝大多数情况下仍在处理范围内。因此,通常不需要担心整数溢出问题。