2160-拆分数位后四位数字的最小和
大约 2 分钟
给你一个四位 正 整数 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/problems/minimum-sum-of-four-digit-number-after-splitting-digits
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
我们来分情况讨论。
数字不含0 我们将4个数位记为d1 d2 d3 d4,并且d1<d2<d3<d4,我们首先证明 d1d3+d2d4是最小的。 4个数字,可以组成两个两位数和一个一位数,一个三位数。 在两位数字里,主要有下面几个竞争者: d1d3 + d2d4 = 10d1 + 10d2 + d3 + d4 d1d2 + d3d4 = 10d1 + 10d3 + d2 + d4 可见明显是d1d3 + d2d4 较小。 一位数和三位数如下: d1d2d3 + d4 = 100d1 + 10 * d2 + d3 + d4 > d1d3 + d2d4 = 10d1 + 10*d2 + d3 + d4 故最小的就是d1d3 + d2d4
数字含有一个0 其余三位数字为d1 d2 d3,设其中d1 < d2 < d3 ,则最小的为d1d2 + d3 或者d1d3 + d2
数字含有两个0 其余两位数字为d1 d2,设其中d1 < d2,则最小的为d1 + d2
数字含有3个0 其余一个数字为d1,则最小的为d1
所以我们可以对数字进行分情况讨论。
public int minimumSum(int num) {
String s = Integer.toString(num);
int[] data = new int[4];
for (int i = 0; i < data.length; i++) {
data[i] = s.charAt(i) - '0';
}
Arrays.sort(data);
int zeroCount = (int) Arrays.stream(data).filter(k -> k == 0).count();
if (zeroCount == 0) {
int a = data[0] * 10 + data[2];
int b = data[1] * 10 + data[3];
return a + b;
} else if (zeroCount == 1) {
return data[1] * 10 + data[2] + data[3];
} else if (zeroCount == 2) {
return data[2] + data[3];
}else if(zeroCount == 3) {
return data[3];
}else{
return 0;
}
}
仔细观察,最后的if语句可以统一为一句代码:
public int minimumSum(int num) {
String s = Integer.toString(num);
int[] data = new int[4];
for (int i = 0; i < data.length; i++) {
data[i] = s.charAt(i) - '0';
}
Arrays.sort(data);
int zeroCount = (int) Arrays.stream(data).filter(k -> k == 0).count();
//替代上述的if语句
return data[0] * 10 + data[1] * 10 + data[2] + data[3];
}