区分奇偶的数组排序

2026 华为OD机试真题 7月26日华为OD上机新系统考试真题 100 分题型

点击查看华为 OD 机试真题完整目录:2026最新华为OD机试新系统卷 + 双机位C卷 真题题库目录|全覆盖题库 + 逐点算法考点详解

题目描述

给定一个非负整数数组 nums,满足以下两个前提条件:

  1. 数组长度为偶数,且 2≤nums.length≤20000
  2. 数组中恰好有一半元素是偶数,另一半元素是奇数

请你对该数组进行重构,满足以下两个核心要求:

  1. 重构后的数组中,所有位于偶数下标(下标从 0 开始)的元素必须是偶数,所有位于奇数下标的元素必须是奇数
  2. 重构后,所有占据偶数下标的偶数元素,需按照从小到大的升序排列;所有占据奇数下标的奇数元素,也需按照从小到大的升序排列

返回满足上述所有条件的重构后数组。

补充说明

  1. 数组长度 n 满足 2≤n≤20000,且 n%2==0
  2. 数组中的元素为非负整数,满足 0≤nums[i]≤1000
  3. 数组中偶数和奇数的数量严格相等,各占 n/2 个
  4. 满足条件的输出数组是唯一的

2026 华为OD机试真题 7月26日华为OD上机新系统考试真题 100 分题型

示例1

输入

4,2,5,7

输出

2,5,4,7

说明

偶数元素为 [4,2],升序后为 [2,4];奇数元素为 [5,7],升序后为 [5,7]

示例2

输入

1,3,2,6,8,5

输出

2,1,6,3,8,5

说明

偶数元素为 [2,6,8](升序后仍为 [2,6,8]),奇数元素为 [1,3,5](升序后仍为 [1,3,5]

示例3

输入

9,0,3,4,7,2

输出

0,3,2,7,4,9

说明

偶数元素为 [0,4,2](升序后为 [0,2,4]),奇数元素为 [9,3,7](升序后为 [3,7,9]

解题思路

核心思想

题目要求偶数下标放偶数,奇数下标放奇数,并且两个位置序列内部都要升序。因此可以先把原数组拆成两个数组:偶数数组和奇数数组;分别排序后,再按下标奇偶交替放回结果数组。

因为题目保证偶数和奇数数量相等,所以排序后的偶数数组一定能填满所有偶数下标,排序后的奇数数组也一定能填满所有奇数下标。

算法步骤

  1. 按示例格式读取一行输入,用英文逗号切分得到 nums
  2. 遍历 nums,将偶数加入 evens,奇数加入 odds
  3. 分别对 evensodds 升序排序。
  4. 创建结果数组 ans
  5. 依次取排序后的偶数放到 0, 2, 4... 下标,取排序后的奇数放到 1, 3, 5... 下标。
  6. 将结果数组按英文逗号拼接输出。

复杂度分析

设数组长度为 n

  • 拆分数组复杂度为 O(n)
  • 两个子数组排序总复杂度为 O(n log n)
  • 合并结果复杂度为 O(n)
  • 总时间复杂度为 O(n log n),空间复杂度为 `O(
THE END