1. 问题描述:
给你一个四位正整数 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)
链接:https://leetcode-cn.com/problems/minimum-sum-of-four-digit-number-after-splitting-digits/
2. 思路分析:
分析题目可以知道我们可以生成四位整数num的全排列,然后暴力枚举求解出最小值即可,可以使用交换元素的方法来生成全排列。
3. 代码如下:
python:
from typing import List
class Solution:
s = None
# 生成nums元素的全排列
def gen(self, index: int, nums: List[int]):
if index == len(nums):
t = ""
for i in range(len(nums)):
t += str(nums[i])
self.s.append(t)
return
for i in range(index, len(nums)):
# 交换当前位置与index位置来生成全排列
nums[i], nums[index] = nums[index], nums[i]
self.gen(index + 1, nums)
# 回溯
nums[i], nums[index] = nums[index], nums[i]
def minimumSum(self, num: int) -> int:
nums = list()
# 因为是多个测试用例所以需要将全局变量置为list
self.s = list()
while num > 0:
nums.append(num % 10)
num //= 10
self.gen(0, nums)
res = 100000
for x in self.s:
res = min(res, int(x[:2]) + int(x[2:]))
return res
go:
package main
import (
"fmt"
)
// 全局变量res来记录最小值
var res int
func get(x int) []int {
res := []int{}
for x > 0 {
res = append(res, x%10)
x /= 10
}
return res
}
// 求解两个int类型数字的最小值
func getMin(a, b int) int {
if a < b {
return a
}
return b
}
func permutation(k int, nums []int) {
if k == len(nums) {
res = getMin(res, nums[0]*10+nums[1]+nums[2]*10+nums[3])
}
for i := k; i < len(nums); i++ {
t := nums[i]
nums[i] = nums[k]
nums[k] = t
permutation(k+1, nums)
t = nums[i]
nums[i] = nums[k]
nums[k] = t
}
}
func minimumSum(num int) int {
// 求解num中各个位上的数字
res = 100000
nums := get(num)
permutation(0, nums)
return res
}