1、问题
2160. 拆分数位后四位数字的最小和https://leetcode.cn/problems/minimum-sum-of-four-digit-number-after-splitting-digits/
给你一个四位 正 整数 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
2、题解
(1)思路:
num是一个四位正整数,那肯定能拿到num的 4 个数字(千位、百位、十位、个位),要将这 4 个数字组合一下。
要想组合成的两个数字,加起来最小,那数字肯定是越短越好,比如num=1234,那拆成12 和 34, 肯定比123 和 4 加起来的和小,因此,问题就转换为了“将4个数字,组成2个两位数的数字”。
那怎么才能使得这 2 个两位数的和最小呢?那就要保证十位要尽量小!那现在答案就出来啦,因为只要确定了两个十位数是较小的两个数,那剩下的两个较大的数,就是个位数啦!比如num=1234,取1、2作为十位数,3、4作为个位数,组成13 和 24(或者14 和 23,求和结果是一样的)。
(2)步骤:
1. 将a、b、c、d分别保存num的千位、百位、十位、个位;
2. 将a、b、c、d按照从小到大排序,排序结果保存到a、b、c、d中(此时 a < b < c < d);
3. 将两位较小的数(a 、b)作为十位,两位较大的数(c 、d)作为个位,即可得出结果
(3)代码:
代码1:
java">class Solution {public int minimumSum(int num) {int a, b , c, d;//1.将a、b、c、d分别保存千位、百位、十位、个位//千位a = num / 1000;num = num % 1000;//百位b = num / 100;num = num % 100;//十位c = num / 10;//个位d = num % 10;//2.给a、b、c、d,按照从小到大排序int[] digits = new int[]{a, b, c, d};//使用冒泡排序,将数组从小到大排序for(int i = 0; i< 3; i++) {for(int j=0; j<3-i; j++) {if(digits [j] > digits [j+1]) {int temp = digits [j+1];digits [j+1] = digits [j];digits [j] = temp;}}}//将a、b、c、d分别保存从小到大的四位数a = digits [0];b = digits [1];c = digits [2];d = digits [3];//3.两位较小的数作为十位,两位较大的数作为个位,想加即得结果return a * 10 + b * 10 + c + d; }
}
代码2:排序不自己手写啦,可以用sort函数直接排序(不过这个耗时很多,个人觉得不如自己手写排序算法好)
java">class Solution {public int minimumSum(int num) {int a, b , c, d;//1.将a、b、c、d分别保存千位、百位、十位、个位//千位a = num / 1000;num = num % 1000;//百位b = num / 100;num = num % 100;//十位c = num / 10;//个位d = num % 10;//2.给a、b、c、d,按照从小到大排序int[] digits = new int[]{a, b, c, d};Arrays.sort(digits);//将a、b、c、d分别保存从小到大的四位数a = digits [0];b = digits [1];c = digits [2];d = digits [3];//3.两位较小的数作为十位,两位较大的数作为个位,想加即得结果return a * 10 + b * 10 + c + d; }
}