数组组成的最小数字

一、题目描述

给定一个整型数组,请从该数组中选择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();
    }
}
相关推荐
ZouZou老师8 小时前
C++设计模式之适配器模式:以家具生产为例
java·设计模式·适配器模式
monster000w9 小时前
大模型微调过程
人工智能·深度学习·算法·计算机视觉·信息与通信
曼巴UE59 小时前
UE5 C++ 动态多播
java·开发语言
小小晓.9 小时前
Pinely Round 4 (Div. 1 + Div. 2)
c++·算法
L、2189 小时前
统一日志与埋点系统:在 Flutter + OpenHarmony 混合架构中实现全链路可观测性
javascript·华为·智能手机·electron·harmonyos
SHOJYS9 小时前
学习离线处理 [CSP-J 2022 山东] 部署
数据结构·c++·学习·算法
VX:Fegn08959 小时前
计算机毕业设计|基于springboot + vue音乐管理系统(源码+数据库+文档)
java·数据库·vue.js·spring boot·后端·课程设计
biter down9 小时前
c++:两种建堆方式的时间复杂度深度解析
算法
程序员鱼皮9 小时前
刚刚,IDEA 免费版发布!终于不用破解了
java·程序员·jetbrains