Python 2022华为秋招软件岗机试

第一题:求山峰面积
求解山峰面积问题,给定一个数组,每个元素值非负,表示山峰的高度,0表示平地。所有相互连接(上下左右)的凸起的高地构成山脉,求最大的山脉面积(一个元素的底面积为1)。

比较简单,其实就是求最大岛屿的问题,只是这里不再是进行加一操作,而是加上当前元素值。

第二题:外卖员到达指定楼层最短时间
外卖员当前处在第N层,需要到达第M层,他每分钟可以选择走楼梯,上一层或者下一层,或者坐电梯到达第2*N层。楼层总共L(< =10 ^ 5)层。
输入:
一行包含两个数字N,M
输出:
最短的时间

采用动态规划方法,dp[i]:从第N层到达第i层所需要的最短时间。
当时通过率为88%,后来发现代码在向下更新的时候,后面的dp[i](i % 2 == 0)没有利用最优的dp[i // 2]进行更新。因此还需要进行一个偶数位的数值更新。

N, M = map(int, input().split())
def funer():
    dp = [float('inf')] * 100005
    dp[N] = 0
    for i in range(N - 1, -1, -1):
        dp[i] = dp[i + 1] + 1
    dp[0] -= 1
    if N >= M:
        return dp[M]
    # 先只考虑向上
    for i in range(N+1, 100000):
        if i == 100000:
            dp[i] = min(dp[i - 1], dp[i // 2]) + 1
        else:
            if i % 2 != 0:
                dp[i] = dp[i - 1] + 1
            else:
                dp[i] = min(dp[i - 1], dp[i // 2]) + 1
    # 再考虑向下
    for i in range(100000, N - 1, -1):
        dp[i] = min(dp[i], dp[i + 1] + 1)
    # 偶数位更新
    for i in range(2, 100000, 2):
        dp[i] = min(min(dp[i - 1], dp[i + 1], dp[i // 2]) + 1, dp[i])
    return dp[M]
res = funer()
print(res)

参考牛客上某位大佬的,看评论说是ac了!

N, M = map(int, input().strip().split(' '))
if M <= N :
    print(N - M)
else:
    dp = [0] * (M + 1)
    for i in range(1, N):
        dp[i] = N - i
    for i in range(N + 1, M + 1):
        down = 1 + dp[i - 1]
        if i % 2 == 0:
            el = dp[i // 2] + 1
        else:
            el = 2 + dp[(i + 1)//2]
        dp[i] = min(down, el)
    print(dp[M])

另外附上BFS求解的代码:

from collections import deque
N, M = map(int, input().strip().split(' '))
def funer():
    visited = [False] * (M + 1)
    visited[N] = True
    q = deque([N])
    ans = 1
    while q:
        for _ in range(len(q)):
            cur = q.popleft()
            a, b, c = cur - 1, cur + 1, 2 * cur
            if a == M or b == M or c == M:
                return ans
            if 0 < a <= M and not visited[a]:
                q.append(a)
                visited[a] = True
            if 0 < b <= M and not visited[b]:
                q.append(b)
                visited[b] = True
            if 0 < c <= M and not visited[c]:
                q.append(c)
                visited[c] = True
        ans += 1
    return -1
if M <= N:
    print(N - M)
else:
    res = funer()
    print(res)

第三题:求最大的相同子树

给定一颗二叉树,找到完全相同的两颗子树(子树层数大于等于2),如果存在多个,则返回最大的子树,如果不存在则输出-1.

输入:
一个数组,表示一颗二叉树,数组元素按层序排序,不存在节点用null表示,每个节点的值在[0,10]之间,不包含0和10,二叉树层数小于5.
[1,2,3,1,null,2,null,null,null,null,nul,1,null,null,null]
输出:
完全相同的子二叉树的数组,子树可以位于不同的层次。
[2,1,null]

与lc652有点类似。

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值