跳至主要內容

2160-拆分数位后四位数字的最小和

daipeng大约 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];
    }