数组组成的最小数字

一、题目描述

给定一个整型数组,请从该数组中选择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. 核心思想

  1. 核心思想

分两步实现 "最小组合字符串" 的目标:先通过数值排序筛选出候选数字(最多 3 个),再通过拼接字典序排序让候选数字拼接后字典序最小 ------ 核心是 "先缩小范围,再优化拼接顺序"。

  1. 问题本质分析

问题本质是双维度排序的字符串组合优化:

  • 第一维度:筛选规则是 "数值最小",需将字符串转换为数值比较;
  • 第二维度:组合规则是 "拼接后字典序最小",需直接比较字符串拼接后的结果(而非单个字符串的字典序);
  • 约束:仅需考虑数值最小的前 3 个数字(减少排序复杂度,且满足 "最少候选数出最小组合" 的逻辑)。
  1. 核心逻辑
  • 数值筛选:通过 "字符串转整数比较" 的排序,快速锁定数值最小的前 3 个候选数字,缩小后续优化范围;
  • 拼接优化:通过 "拼接后字典序比较" 的排序,调整候选数字的顺序,确保最终拼接结果是所有可能组合中字典序最小的。
  1. 步骤拆解

  2. 输入解析:

    • 将输入字符串按逗号分割为数字字符串数组strs。
  3. 数值筛选排序:

    • 对strs按数值升序排序,确保数组前几位是数值最小的数字。
    • 截取前 3 个(或全部)元素,得到候选数组tmp。
  4. 拼接优化排序:

    • 对tmp按 "拼接后字典序升序" 排序,核心比较规则:(a + b).compareTo(b + a)。
  5. 结果拼接与输出:

    • 遍历排序后的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();
    }
}
相关推荐
AI你一生一世35 分钟前
不止于时序存储:DolphinDB 如何成为 AI 时代的工业智能底座
java·人工智能·struts·时序数据库·工业智能·dolphindb·ai基础设施
云-缩影1 小时前
拆解 AI 图像生成应用的后端架构:ECS、OSS 和大模型 API 怎么配合
java·spring boot·后端
瑞克-桑切斯1 小时前
7、MySQL 慢查询排查与优化实战指南
java·服务器·数据库
ZhengEnCi2 小时前
大模型的分类到底怎么分:从基础模型到推理模型、从通用到专用的完整图谱
算法
取名真是3 小时前
Python 算法知识点从基础到进阶
开发语言·python·算法
贾伟康3 小时前
HarmonyOS API 26 UKey PIN 授权门禁:状态查询、失败归因与资源闭环
华为·harmonyos
罗西的思考3 小时前
【轻量化复刻大模型 / KIMI K3】KDA 模块交互式演示
人工智能·算法·机器学习
nm_zfyjt5 小时前
信息流广告投放优化实践:线索成本评估模型与转化链路重构(家装建材案例)
算法·重构·内蒙古朋友圈广告服务商·内蒙古朋友圈获客
海的透彻5 小时前
dockerfile如何快速构建容器(java服务)
java·开发语言
code2cat6 小时前
Java工具篇之Gradle:用任务图组织构建与交付
java·开发语言·单元测试·gradle