第 14 题
答案与解析
第(1)小题
3
波峰必须由连续上升转为连续下降;持平段会中断上升或下降,不能跨过持平段继续累计。对称比较的是两侧变化段的个数,不是数值增减的幅度。
从左到右,题给数组共有以下4个波峰:
| 波峰对应的数据 | 峰顶 | 上升段数 | 下降段数 | 是否对称 |
|---|---|---|---|---|
| 2,4,3 | 4 | 1 | 1 | 是 |
| 2,6,8,5 | 8 | 2 | 1 | 否 |
| 5,6,3 | 6 | 1 | 1 | 是 |
| 3,4,8,6,1 | 8 | 2 | 2 | 是 |
第一个波峰在4下降到第一个3后结束,随后的3→3是持平段;再后面的3→2不属于这个波峰。四个波峰中有3个满足上升段数与下降段数相同。
第(2)小题
cnt = 0
a[i-1] < a[i] and a[i] > a[i+1]
i - left == right - i
程序分析
def peaks(a):
n = len(a)
if n < 3: # 至少需要3个元素才能形成波峰
return 0
①
for i in range(1, n - 1):
if ②:
...
return cnt主程序把数组a传给peaks。函数先取得数组长度n;不足3个元素时无法形成先升后降的波峰,直接返回0。其余情况下,i遍历1至n-2,保证当前元素左右都有相邻元素,空②决定哪些位置进入波峰的两侧查找。
left = i
while left > 0 and a[left - 1] < a[left]:
left -= 1left从当前位置i出发。只要左侧相邻元素更小,就将left左移;每次左移对应纳入一段朝峰顶上升的变化段。到达数组左端或遇到不再严格上升的相邻关系时停止,left定位这段连续上升过程的起点。
right = i
while right < n - 1 and a[right] > a[right + 1]:
right += 1
if ③:
cnt += 1right也从i出发,在当前值大于右侧相邻值时右移,每次纳入一段下降段。停止后,right定位连续下降过程的终点。两侧查找都使用严格大小比较,遇到相等值即停止。随后只有满足空③时才将cnt加1,最终返回cnt,因此cnt用于累计符合要求的波峰个数。
填空分析
①
后文通过cnt += 1累计数量,遍历前尚未统计任何波峰,应初始化cnt = 0。初始化放在for循环之前,才能保留各轮的累计结果。
②
只有当前位置是严格峰顶,才需要向左右寻找波峰边界。峰顶左侧须为上升段,即a[i-1] < a[i];右侧须为下降段,即a[i] > a[i+1]。两者同时满足,填写a[i-1] < a[i] and a[i] > a[i+1],也可写成a[i-1] < a[i] > a[i+1]。
③
left到i共有i-left个相邻变化段,i到right共有right-i个相邻变化段。对称波峰要求这两个数量相同,因此填写i - left == right - i。这里比较的是段数,不能用两端与峰顶的数值差判断对称。
问题反馈
解析有疑问或显示异常?请先复制题目信息,再打开反馈表单填写。
题目编号:2026_03_G3_xinzhendi_q014
