华为OD机试真题——数组组成的最小数字(2025B卷:100分)Java/python/JavaScript/C/C++/GO最佳实现

在这里插入图片描述

2025 B卷 100分 题型

本专栏内全部题目均提供Java、python、JavaScript、C、C++、GO六种语言的最佳实现方式;
并且每种语言均涵盖详细的问题分析、解题思路、代码实现、代码详解、3个测试用例以及综合分析;
本文收录于专栏:《2025华为OD真题目录+全流程解析+备考攻略+经验分享

华为OD机试真题《数组组成的最小数字》:


文章快捷目录

题目描述及说明

Java

python

JavaScript

C++

C

GO


题目名称:数组组成的最小数字


  • 知识点:字符串排序、贪心算法
  • 时间限制:1秒
  • 空间限制:256MB
  • 限定语言:不限

题目描述

给定一个整型数组,请从该数组中选择3个元素组成最小数字并输出。如果数组长度小于3,则选择数组中所有元素来组成最小数字。

输入描述
一行用半角逗号分隔的整型数组,数组长度范围为 (0 < 数组长度<= 100),每个整数的取值范围为 (0 < 整数的取值范围 <= 10000)。

输出描述
由3个元素组成的最小数字(若数组长度小于3,则使用全部元素),输出的数字应为字符串拼接后的形式(如示例中的整数组合)。

示例

  1. 输入
    21,30,62,5,31
    输出
    21305
    说明:选择 21305 三个元素拼接成的 21305 是所有组合中的最小值。

  2. 输入
    5,21
    输出
    215
    说明:数组长度小于3,使用所有元素拼接。


Java

问题分析

我们需要从给定数组中选择3个元素(若数组长度小于3则使用所有元素),将它们按一定顺序拼接成最小的数字字符串。核心在于如何确定元素的拼接顺序,使得合成后的字符串数值最小。

解题思路

  1. 字符串排序:将数组转为字符串后按自定义规则排序,规则是两个字符串a和b比较时,若a+b的字典序小于b+a,则a排在前面。这样可以确保较小组合优先。
  2. 排列生成:对于长度≤3的数组,生成所有可能的排列组合;对于长度>3的数组,遍历所有三元组生成所有排列组合。
  3. 最小值比较:在所有生成的排列组合中找到字典序最小的字符串。

代码实现

import java.util.*;

public class Main {
   
   
    public static void main(String[] args) {
   
   
        Scanner sc = new Scanner(System.in);
        String input = sc.nextLine().trim();
        String[] parts = input.split(",");
        List<String> nums = Arrays.asList(parts);
        
        // 处理空数组的情况(根据题目约束,输入长度>0,此处可省略)
        if (nums.isEmpty()) {
   
   
            System.out.println("0");
            return;
        }
        
        // 自定义排序:确保拼接后的字符串最小
        nums.sort((a, b) -> (a + b).compareTo(b + a));
        
        String minStr = null;
        int size = nums.size();
        
        if (size <= 3) {
   
    // 数组长度≤3,使用所有元素生成排列
            List<String> elements = new ArrayList<>(nums);
            if (size == 1) {
   
   
                minStr = elements.get(0);
            } else if (size == 2) {
   
   
                String s1 = elements.get(0) + elements.get(1);
                String s2 = elements.get(1) + elements.get(0);
                minStr = s1.compareTo(s2) < 0 ? s1 : s2;
            } else {
   
    // size == 3,枚举6种排列
                String[] perms = {
   
   
                    elements.get(0) + elements.get(1) + elements.get(2),
                    elements.get(0) + elements.get(2) + elements.get(1),
                    elements.get(1) + elements.get(0) + elements.get(2),
                    elements.get(1) + elements.get(2) + elements.get(0),
                    elements.get(2) + elements.get(0) + elements.get(1),
                    elements.get(2) + elements.get(1) + elements.get(0)
                };
                for (String s : perms) {
   
   
                    if (minStr == null || s.compareTo(minStr) < 0) {
   
   
                        minStr = s;
                    }
                }
            }
        } else {
   
    // 长度>3,遍历所有三元组并生成排列
            for (int i = 0; i < size; i++) {
   
   
                for (int j = i + 1; j < size; j++) {
   
   
                    for (int k = j + 1; k < size; k++) {
   
   
                        String a = nums.get(i), b = nums.get(j), c = nums.get(k);
                        String[] perms = {
   
   
                            a + b + c, a + c + b,
                            b + a + c, b + c + a,
                            c + a + b, c + b + a
                        };
                        for (String s : perms) {
   
   
                            if (minStr == null || s.compareTo(minStr) < 0) {
   
   
                                minStr = s;
                            }
                        }
                    }
                }
            }
        }
        System.out.println(minStr)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

纪元A梦

再小的支持也是一种动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值