leetcode
leetcode 1901 ~ 1950
拆分数位后四位数字的最小和

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

难度:

标签:

题目描述

代码结果

运行时间: 19 ms, 内存: 16.0 MB


/*
 * 思路:
 * 1. 使用Java Stream提取和排序每一位数字。
 * 2. 组合排序后的数字,使它们的和最小。
 * 3. 返回这两个数的和。
 */
import java.util.stream.IntStream;
import java.util.stream.Collectors;
import java.util.Arrays;
public class Solution {
    public int minimumSum(int num) {
        // 提取每一位数字并排序
        int[] digits = Arrays.stream(String.valueOf(num).split("")).mapToInt(Integer::parseInt).sorted().toArray();
        // 组合成两个数
        int new1 = digits[0] * 10 + digits[2];
        int new2 = digits[1] * 10 + digits[3];
        // 返回和
        return new1 + new2;
    }
}

解释

方法:

首先,将整数num转换为字符串并将其每个字符存入一个列表中。接着,对这个列表进行排序,这样可以确保较小的数字排在前面,有利于构成较小的新整数。为了得到两个可能的最小整数,采用交错取数的方式,即从排序后的列表中,依次选择索引为偶数的元素构成一个新整数(new1),索引为奇数的元素构成另一个新整数(new2)。最后,将这两个新整数从字符串转换为整数并求和。

时间复杂度:

O(1)

空间复杂度:

O(1)

代码细节讲解

🦆
为什么选择将数字转换为字符串并对其字符进行排序,这样的排序有什么特别的目的吗?
将数字转换为字符串并对字符进行排序是为了让数字的每一位都能按照从小到大的顺序排列。这样做的目的是为了确保在构造新的两个整数时,可以更容易地通过选择位置来最小化这两个整数的值。排序确保了数字的每一位都被最优地分配到两个新整数中,从而达到最小化它们和的目的。
🦆
在构造新整数时,为什么采用交错取数的方式,即索引为偶数的元素构成一个新整数,索引为奇数的元素构成另一个新整数?这种方法是如何帮助实现最小和的?
采用交错取数的方式是为了均匀地分配排序后的数字字符到两个新整数中。这种方法通过将排序后的最小的数字和次小的数字分别放在不同的整数中,可以有效地减少两个整数的值。例如,排序后最小的数字分配给第一个整数,第二小的数字分给第二个整数,以此类推,从而使得两个整数的组合尽可能小,最终实现整体和的最小化。
🦆
对于有相同数位的情况,例如'2222',这种方法是否还能保证得到最小和,为什么?
对于所有数位相同的情况,例如'2222',这种方法依然能得到相对最小的和。因为无论如何分配这些相同的数字,构成的两个新整数都将是相同的。例如,无论是'22'和'22',还是任何其他的组合,得到的新整数和总会是相同的。因此,即使这种方法在数位完全相同的特殊情况下不能进一步最小化结果,它仍然能保证得到可能的最小和。
🦆
这种方法在处理可能的前导0时有什么特殊的处理吗?例如在示例2中输入为'40',输出是否会影响整数的值?
在这种方法中,没有特殊处理来避免前导0的问题,因为在将字符数组转换回整数时,前导0自然不会影响整数的值。例如,若一个新整数为'02',在转换为整数时,它会自动变为2,从而不影响最终的和。因此,即使在数字字符被分配时形成了前导0,这些0在最终的数值计算中会被忽略,不会影响结果。

相关问题