华为OD机试真题——高矮个子排队(2025B卷:100分)Java/python/JavaScript/C++最佳实现

在这里插入图片描述

2025 B卷 100分 题型

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

华为OD机试真题《高矮个子排队》:


文章快捷目录

题目描述及说明

Java

python

JavaScript

C++


题目名称:高矮个子排队


  • 知识点:逻辑处理、数组操作
  • 时间限制:1秒
  • 空间限制:256MB
  • 限定语言:不限

题目描述

现在有一队小朋友,他们高矮不同,以正整数数组表示身高(例如 {5,3,1,2,3})。要求将他们按“高”“矮”“高”“矮”交替的顺序排列,规则如下:

  1. **奇数位(从1开始)**的小朋友身高需 相邻偶数位的小朋友;
  2. 偶数位的小朋友身高需 相邻奇数位的小朋友;
  3. 移动距离最小化:若交换位置,移动距离定义为位置差的绝对值(例如从第2位移动到第3位,距离为1)。
  4. 非法输入处理:若输入含非数字,返回空数组 []

示例

  • 输入:4 1 3 5 2
    输出:4 1 5 2 3(交换3和5,移动距离均为1)
  • 输入:x x x
    输出:[]

Java

问题分析

题目要求将小朋友按"高矮高矮"的交替顺序排列,规则如下:

  1. 位置要求
    • 奇数位(1、3、5…)身高 ≥ 相邻偶数位
    • 偶数位(2、4、6…)身高 ≤ 相邻奇数位
  2. 移动最小化:交换时移动距离最小(相邻交换移动距离=1)
  3. 非法输入:含非数字时返回空数组
关键挑战:
  • 高效实现交替排列
  • 保证相邻交换最小化移动距离
  • 处理非法输入
  • 允许相等值(≥/≤ 而非 >/<)

解题思路

  1. 输入处理

    • 读取空格分隔的字符串
    • 验证是否为纯数字
    • 非法输入返回空数组
  2. 波浪排序算法

    • 遍历数组(索引0到n-2)
    • 偶数索引(奇数位):
      • 要求 arr[i] >= arr[i+1]
      • 不满足则交换
    • 奇数索引(偶数位):
      • 要求 arr[i] <= arr[i+1]
      • 不满足则交换
  3. 算法正确性

    • 每次交换只影响相邻元素
    • 交换后前序条件仍满足
    • 单次遍历即可完成排序

代码实现

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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

纪元A梦

再小的支持也是一种动力

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

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

打赏作者

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

抵扣说明:

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

余额充值