2025 B卷 100分 题型
本专栏内全部题目均提供Java、python、JavaScript、C++等多种语言的最佳实现方式;
并且每种语言均涵盖详细的问题分析、解题思路、代码实现、代码详解、3个测试用例以及综合分析;
本文收录于专栏:《2025华为OD真题目录+全流程解析+备考攻略+经验分享》
华为OD机试真题《高矮个子排队》:
文章快捷目录
题目描述及说明
Java
python
JavaScript
C++
题目名称:高矮个子排队
- 知识点:逻辑处理、数组操作
- 时间限制:1秒
- 空间限制:256MB
- 限定语言:不限
题目描述
现在有一队小朋友,他们高矮不同,以正整数数组表示身高(例如 {5,3,1,2,3}
)。要求将他们按“高”“矮”“高”“矮”交替的顺序排列,规则如下:
- **奇数位(从1开始)**的小朋友身高需 ≥ 相邻偶数位的小朋友;
- 偶数位的小朋友身高需 ≤ 相邻奇数位的小朋友;
- 移动距离最小化:若交换位置,移动距离定义为位置差的绝对值(例如从第2位移动到第3位,距离为1)。
- 非法输入处理:若输入含非数字,返回空数组
[]
。
示例:
- 输入:
4 1 3 5 2
输出:4 1 5 2 3
(交换3和5,移动距离均为1) - 输入:
x x x
输出:[]
Java
问题分析
题目要求将小朋友按"高矮高矮"的交替顺序排列,规则如下:
- 位置要求:
- 奇数位(1、3、5…)身高 ≥ 相邻偶数位
- 偶数位(2、4、6…)身高 ≤ 相邻奇数位
- 移动最小化:交换时移动距离最小(相邻交换移动距离=1)
- 非法输入:含非数字时返回空数组
关键挑战:
- 高效实现交替排列
- 保证相邻交换最小化移动距离
- 处理非法输入
- 允许相等值(≥/≤ 而非 >/<)
解题思路
-
输入处理:
- 读取空格分隔的字符串
- 验证是否为纯数字
- 非法输入返回空数组
-
波浪排序算法:
- 遍历数组(索引0到n-2)
- 偶数索引(奇数位):
- 要求
arr[i] >= arr[i+1]
- 不满足则交换
- 要求
- 奇数索引(偶数位):
- 要求
arr[i] <= arr[i+1]
- 不满足则交换
- 要求
-
算法正确性:
- 每次交换只影响相邻元素
- 交换后前序条件仍满足
- 单次遍历即可完成排序
代码实现
import java.util.*;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
String input = sc.nextLine().trim();
// 1. 检查非法输入
if (!input.matches("[0-9\\s]+")) {
System.out.println("[]");
return;
}
// 2. 分割输入字符串
String[] parts = input.split("\\s+");
int n = parts.length;
int[] arr = new int[n];
try {
// 3. 转换为整数数组
for (int i = 0; i < n; i++) {
arr[i] = Integer.parseInt(parts[i]);
}
} catch (NumberFormatException e) {
// 4. 转换失败处理
System.out.println("[]");
return;
}
// 5. 波浪排序(高矮交替)
for (int i = 0; i < n - 1; i++) {
if (i % 2 == 0) {
// 6. 奇数位需≥下一位
if (arr[i] < arr[i + 1]) {
// 7. 交换相邻元素
int temp = arr[i];
arr[i] = arr[i + 1];
arr[i + 1] = temp;
}
} else {
// 8. 偶数位需≤下一位
if (arr[i] > arr[i + 1