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,则使用全部元素),输出的数字应为字符串拼接后的形式(如示例中的整数组合)。
示例
-
输入:
21,30,62,5,31
输出:
21305
说明:选择21
、30
、5
三个元素拼接成的21305
是所有组合中的最小值。 -
输入:
5,21
输出:
215
说明:数组长度小于3,使用所有元素拼接。
Java
问题分析
我们需要从给定数组中选择3个元素(若数组长度小于3则使用所有元素),将它们按一定顺序拼接成最小的数字字符串。核心在于如何确定元素的拼接顺序,使得合成后的字符串数值最小。
解题思路
- 字符串排序:将数组转为字符串后按自定义规则排序,规则是两个字符串a和b比较时,若a+b的字典序小于b+a,则a排在前面。这样可以确保较小组合优先。
- 排列生成:对于长度≤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)