我在双机位机考那道“高矮个子排队”上,其实一开始就踩了一个很蠢的坑:看到题目里有排队两个字,第一反应是把所有人按身高从小到大排一遍,结果连样例都过不了。原因并不复杂——题目要的不是单调有序,而是高矮相间。换句话说,最后输出的队形必须满足“第一个人比第二个人高,第二个人比第三个人矮,第三个人比第四个人高……”这样一个不断上下起伏的序列。
题名很有迷惑性,但它不是一道单纯考 sort 的题,更像是在问:你能不能把一个无序数组快速重排成相邻位置“高低交替”的形态。更巧的是,这类解法在 Java、Python、JavaScript、C/C++、Go 里都能用同一套思路写出来,差异基本只剩输入输出写法。下面这篇我会把题目定位、两种可 AC 的思路、五门语言的完整实现,还有实际跑判题机时最容易丢分的几个边界点一次性讲清楚。
1. 高矮个子排队真正要算的,是相邻位置的峰谷关系
1.1 题目表面在排队,内核是摆动序列
先把规则固定下来。华为 OD 机考的题目描述通常比较口语化,但核心约束翻译成数组语言就是:
给定一个整数数组
heights,对数组重新排列,使得heights[0] > heights[1] < heights[2] > heights[3] < heights[4] ...。
也就是下标从 0 开始,偶数位置的人要比右边的人高,奇数位置的人要比右边的人矮。画成折线图就是一个接一个的“山峰”和“
