📅  最后修改于: 2023-12-03 15:06:42.391000             🧑  作者: Mango
题目描述:给定一个非空整数数组,找到两个数,使得它们的位数总和相等,并且它们的和最大。
本题最简单的思路就是将整数数组中所有的数按照位数总和分类,然后找到两个位数总和相等的分类,从中找到两个数进行求和。如果某个分类中只有一个数,则直接跳过。
首先需要一个函数来计算一个非负整数的位数总和。如下:
def digit_sum(num: int) -> int:
"""
计算一个非负整数的位数总和
:param num: 非负整数
:return: 位数总和
"""
res = 0
while num > 0:
res += num % 10
num //= 10
return res
接下来,我们可以用字典来记录所有位数总和的分类。遍历整个数组,将它们按照位数总和分类保存到字典中。如果某个分类的长度为1,则直接跳过。如果某个分类的长度大于等于2,则计算它们之间的和,并更新最大值。
代码如下:
from typing import List
def max_sum(nums: List[int]) -> int:
"""
找到两个数,它们的位数总和相等,并且它们的和最大
:param nums: 非空整数数组
:return: 最大和
"""
digit_sum_dict = {}
max_sum = float('-inf')
for num in nums:
ds = digit_sum(num)
if ds not in digit_sum_dict:
digit_sum_dict[ds] = [num]
else:
digit_sum_dict[ds].append(num)
if len(digit_sum_dict[ds]) >= 2:
sorted_lst = sorted(digit_sum_dict[ds], reverse=True)
cur_sum = sorted_lst[0] + sorted_lst[1]
if cur_sum > max_sum:
max_sum = cur_sum
return max_sum
本题的解法虽然简单,但要注意细节问题,比如分类中只有一个数的情况。另外,题目中的“位数总和”不一定要求是十进制下的位数总和,可以是其他进制,这个不会影响解法。