题目
给你一个四位 正 整数 num 。请你使用 num 中的 数位 ,将 num 拆成两个新的整数 new1 和 new2 。new1 和 new2 中可以有 前导 0 ,且 num 中 所有 数位都必须使用。
比方说,给你 num = 2932 ,你拥有的数位包括:两个 2 ,一个 9 和一个 3 。一些可能的 [new1, new2] 数对为 [22, 93],[23, 92],[223, 9] 和 [2, 329] 。
请你返回可以得到的 new1 和 new2 的 最小 和。
示例 1:
输入:num = 2932
输出:52
解释:可行的 [new1, new2] 数对为 [29, 23] ,[223, 9] 等等。
最小和为数对 [29, 23] 的和:29 + 23 = 52 。
示例 2:
输入:num = 4009
输出:13
解释:可行的 [new1, new2] 数对为 [0, 49] ,[490, 0] 等等。
最小和为数对 [4, 9] 的和:4 + 9 = 13 。
提示:
1000 <= num <= 9999
来源:力扣(LeetCode)
解题思路
能够组成数对的情况一共就两种,一种是一个数是一个一位数,另一个数是一个三位数,另一种情况是,两个数都是两位数。分析两种情况,假设四位数的四个数位是a,b,c,d,情况一:abc和d,那么abc+d=a×100+b×10+c+d;情况二:ab和cd,那么ac+bd=a×10+b×10+c+d。不管情况一还是情况二要想使得它们的和最小,那么高权位的数字应该较小,那么依照情况一或二我们假设a和b较小,c和d较大,显然情况二的一般情况是要好于情况一的,现在考虑特殊的数字0,假设最高的权位选0,那么充其量情况一也才只能和情况二打个平手,所以我们采取情况二。在情况二中仍需要分析选出两个较小的数之后,还剩下两个较大的数,显然让两个较大的数中最大的数跟在两个较小的数的最小的数后面,两个较大的数中较小的数跟在两个较小的数较大的后面最好。
class Solution:
def minimumSum(self, num: int) -> int:
temp=[]
while num>0: #拆分数位
temp.append(num%10)
num//=10
temp.sort()
return temp[0]*10+temp[1]*10+temp[2]+temp[3]