一、题目描述
给定一个整型数组,请从该数组中选择3个元素组成最小数字并输出
如果数组长度小于3,则选择数组中所有元素来组成最小数字。
二、输入输出描述
输入描述
一行用半角逗号分割的字符串形式的整型数组。
约束:
- 数组长度 0 < 长度 ≤ 100;
- 数组元素取值范围 0 < 整数 ≤ 10000。
输出描述
由3个元素组成的最小数字,如果数组长度小于3,则选择数组中所有元素来组成最小数字。
三、示例
|----|-----------------------------------------------------------|
| 输入 | 21,30,62,5,31 |
| 输出 | 21305 |
| 说明 | 数组长度超过3,需要选3个元素组成最小数字,21305由21,30,5三个元素组成的数字,为所有组合中最小的数字。 |
|----|--------------------------------|
| 输入 | 5,21 |
| 输出 | 215 |
| 说明 | 数组长度小于3, 选择所有元素来组成最小值,215为最小值。 |
四、解题思路
1. 核心思想
- 核心思想
分两步实现 "最小组合字符串" 的目标:先通过数值排序筛选出候选数字(最多 3 个),再通过拼接字典序排序让候选数字拼接后字典序最小 ------ 核心是 "先缩小范围,再优化拼接顺序"。
- 问题本质分析
问题本质是双维度排序的字符串组合优化:
- 第一维度:筛选规则是 "数值最小",需将字符串转换为数值比较;
- 第二维度:组合规则是 "拼接后字典序最小",需直接比较字符串拼接后的结果(而非单个字符串的字典序);
- 约束:仅需考虑数值最小的前 3 个数字(减少排序复杂度,且满足 "最少候选数出最小组合" 的逻辑)。
- 核心逻辑
- 数值筛选:通过 "字符串转整数比较" 的排序,快速锁定数值最小的前 3 个候选数字,缩小后续优化范围;
- 拼接优化:通过 "拼接后字典序比较" 的排序,调整候选数字的顺序,确保最终拼接结果是所有可能组合中字典序最小的。
-
步骤拆解
-
输入解析:
- 将输入字符串按逗号分割为数字字符串数组
strs。
- 将输入字符串按逗号分割为数字字符串数组
-
数值筛选排序:
- 对
strs按数值升序排序,确保数组前几位是数值最小的数字。 - 截取前 3 个(或全部)元素,得到候选数组
tmp。
- 对
-
拼接优化排序:
- 对
tmp按 "拼接后字典序升序" 排序,核心比较规则:(a + b).compareTo(b + a)。
- 对
-
结果拼接与输出:
- 遍历排序后的
tmp,拼接所有元素为最终字符串,返回并输出。
- 遍历排序后的
五、代码实现
java
import java.util.Arrays;
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
String[] strs = sc.nextLine().split(",");
System.out.println(getResult(strs));
}
/**
* 核心处理方法:获取拼接后的最小数字字符串
* @param strs 输入的数字字符串数组
* @return 拼接后的最小数字字符串
*/
public static String getResult(String[] strs) {
// 第一步:将字符串数组按数值大小升序排序(把数值小的排前面)
// 比较器:将字符串转成整数,通过差值实现升序排序
Arrays.sort(strs, (a, b) -> Integer.parseInt(a) - Integer.parseInt(b));
// 第二步:截取前3个最小的元素(如果数组长度不足3,则取全部)
// Math.min(3, strs.length) 处理数组长度小于3的边界情况
String[] tmp = Arrays.copyOfRange(strs, 0, Math.min(3, strs.length));
// 第三步:对截取的数组按"拼接后更小"的规则排序
// 比较器逻辑:比较 a+b 和 b+a 的字典序,小的排前面(例如 "10"+"2"="102" < "2"+"10"="210")
Arrays.sort(tmp, (a, b) -> (a + b).compareTo(b + a));
// 第四步:拼接排序后的字符串数组,形成最终结果
StringBuilder sb = new StringBuilder();
for (String s : tmp) {
sb.append(s);
}
// 返回拼接后的字符串
return sb.toString();
}
}