🚩 题目链接
⛲ 题目描述
给你一个正整数 num ,请你将它分割成两个非负整数 num1 和 num2 ,满足:
num1 和 num2 直接连起来,得到 num 各数位的一个排列。
换句话说,num1 和 num2 中所有数字出现的次数之和等于 num 中所有数字出现的次数。
num1 和 num2 可以包含前导 0 。
请你返回 num1 和 num2 可以得到的和的 最小 值。
注意:
num 保证没有前导 0 。
num1 和 num2 中数位顺序可以与 num 中数位顺序不同。
示例 1:
输入:num = 4325
输出:59
解释:我们可以将 4325 分割成 num1 = 24 和 num2 = 35 ,和为 59 ,59 是最小和。
示例 2:
输入:num = 687
输出:75
解释:我们可以将 687 分割成 num1 = 68 和 num2 = 7 ,和为最优值 75 。
提示:
10 <= num <= 109
🌟 求解思路&实现代码&运行结果
⚡ 贪心
🥦 求解思路
- 题目让我们求的是如何将一个数字拆分为俩个不同的数字,数字的顺序可以打乱,也就是任意组合,最终求解的是俩个数字的最小和。
- 因为顺序不影响最终的结果,所以,我们先对拆分后的数组升序排序。然后对其进行组合。
- 怎么组合呢?也就是贪心的规律所在,俩个数差距尽可能小的原则,进行组合。
- 怎么实现呢?对排序后的数组遍历,从左向右,将数字挨个分配给第一个数和第二个数。最终求和的结果就是答案。
- 具体求解的过程步骤请看下面代码。
🥦 实现代码
class Solution {
private char[] c;
private int n;
public int splitNum(int num) {
this.c=String.valueOf(num).toCharArray();
Arrays.sort(c);
this.n=c.length;
int num1=getNumber(0);
int num2=getNumber(1);
return num1+num2;
}
public int getNumber(int flag){
StringBuilder sb=new StringBuilder("");
for(int i=flag;i<c.length;i+=2){
sb.append(c[i]+"");
}
return Integer.parseInt(sb.toString());
}
}