【华为OD机试真题 Python】攀登者1|解题思路、代码解析

这篇博客介绍了华为在线测评(OD)中的一道Python算法题,涉及攀登地图的问题。博主分析了题意,解释了如何处理边界情况,通过遍历数组判断山峰,提供了解题思路和实现代码,最终给出山峰数量的计算方法。

题目描述

攀登者喜欢寻找各种地图,并且尝试攀登到最高的山峰。
地图表示为一维数组,数组的索引代表水平位置,数组的高度代表相对海拔高度。其中数组元素0代表地面。
例如[0,1,2,4,3,1,0,0,1,2,3,1,2,1,0], 代表如下图所示的地图,地图中有两个山脉位置分别为 1,2,3,4,5和8,9,10,11,12,13,最高峰高度分别为 4,3。最高峰位置分别为3,10。
一个山脉可能有多座山峰(高度大于相邻位置的高度,或在地图边界且高度大于相邻的高度)。
4

          +---+ 
          |   | 
          |   | 3                       3 
          |   | 
          |   +---+                   ----- 
          |       |                   |   | 
        2 |       |                 2 |   |     2 
          |       |                   |   | 
      +---+       |               ----+   |   +---+ 
      |           |               |       |   |   | 
    1 |           | 1           1 |       | 1 |   | 1 
      |           |               |       |   |   | 
  +---+           +---+       +---+       +---+   +---+ 
  |                   |       |                       | 
0 |                   | 0   0 |                       | 0 
  |                   |       |                       | 

±–+ ±------+ ±–+

0   1   2   3   4   5   6   7   8   9  10  11  12  13  14

登山时会消耗登山者的体力(整数),上山时,消耗相邻高度差两倍的体力,下坡时消耗相邻高度差一倍的体力,平地不消耗体力,登山者体力消耗到零时会有生命危险。
例如,上图所示的山峰,从索引0,走到索引1,高度差为1,需要消耗2X1=2的体力,从索引2高度2走到高度4索引3需要消耗2X2=4的体力。如果是从索引3走到索引4则消耗1X1=1的体力。
登山者想要知道一张地图中有多少座山峰

输入

输出

示例1

输入

[0,1,4,3,1,0,0,1,2,3,1,2,1,0]

输出

3

说明

山峰所在的索引分别为 2,10,12

解题思路

在山地图的两端添加0,以处理边界情况。
遍历山地图,检查每个元素是否大于其相邻的元素。
如果当前元素大于其前后两个元素,则计数器加1。
返回计数器的值作为山峰的数量。

实现代码

class Solution:
    def count_peaks(self, hill_map):
        hill_map.insert(0, 0)
        hill_map.append(0)
        cnt = 0
        for i in range(1, len(hill_map)):
            if i + 1 < len(hill_map):
                if hill_map[i] > hill_map[i - 1] and hill_map[i] > hill_map[i + 1]:
                    cnt += 1
        return cnt


此为分隔符,请忽略

O / s % J a 1 W 3 4 g E X / 4 D c y 7 j b . C
% X @ 1 1 s 7 7 @ c C 9 T & d z ) *
* l r V N E @ j S E F N M @ J Y
$ q w ? E I / b T Z 6 ! u i 3
0 o a H i k * F @ c . s h , 1 l ’ i h T
r b i " ’ . D y I Z s y 9 Q : E !
’ 6 v % v 5 H T j 5 f c M
z s . D s Q 2 0 r R ’ F J Y k s A y K 7 g
9 z K Y ! v M h b r g p v g
y L @ 9 $ I N g l = A Y m ’ !
k 4 : S n X C ) ; * v t I 6 ? 3 F
o o / D k V l B e h V v @ $ Z I = q J b / "
b 5 b M g Z w E + k u r t % g 1 k m n r v s 6 N 8 3 X
= 5 z f J s O S d o L p * " W 7 z * 2 a d b
: ’ ! i . ) 6 K ! F ! j q 4 N o V ! e 7 j I
4 o j G L 4 Z c / k W g y . e U ’ 4 F C
d + L & ( v t & ? 6 ; 1 t 4 m A N
j $ ) / 1 k 6 r @ b z / C S C h T Y k )
P 4 b p 3 q / j T G 5 + 1 ) r R W *
* " q C @ e Z W L d l 0 n P 2 y r f e A S @ 6 d s


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值