数组组成的最小数字

一、题目描述

给定一个整型数组,请从该数组中选择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();
    }
}
相关推荐
海清河晏1111 小时前
数据结构 | 单循环链表
数据结构·算法·链表
提子拌饭1332 小时前
风息时钟:鸿蒙Flutter 实现的自然风格时钟应用
flutter·华为·架构·开源·harmonyos
wuweijianlove5 小时前
算法性能的渐近与非渐近行为对比的技术4
算法
一定要AK5 小时前
Spring 入门核心笔记
java·笔记·spring
A__tao5 小时前
Elasticsearch Mapping 一键生成 Java 实体类(支持嵌套 + 自动过滤注释)
java·python·elasticsearch
_dindong5 小时前
cf1091div2 C.Grid Covering(数论)
c++·算法
AI成长日志5 小时前
【Agentic RL】1.1 什么是Agentic RL:从传统RL到智能体学习
人工智能·学习·算法
KevinCyao5 小时前
java视频短信接口怎么调用?SpringBoot集成视频短信及回调处理Demo
java·spring boot·音视频
迷藏4946 小时前
**发散创新:基于Rust实现的开源合规权限管理框架设计与实践**在现代软件架构中,**权限控制(RBAC)** 已成为保障
java·开发语言·python·rust·开源
哈里谢顿6 小时前
如何实现分布式锁
面试