笔试编程一

1.给定一个整型数组arr,已知其中所有的值都是非负,将这个数组看作一个柱子的高度图,计算按此排列的主子,下雨之后能接多少水。(数组以外的区域高度视为0)。如下图所示:9fa4fd03f98441da8e23a2817b6731e8.png

输入:[3,1,2,5,2,4]

输出:5

解题思路:对每一列求其 左边的最大值 和 右边的最大值 ,然后 该列值 减去两个最大值中的最小值就是该列可以保存的水量。

def maxWater(arr):
    if(len(arr)==0): return 0
    res = 0

    lMax, rMax  = [_ for _ in arr], [_ for _ in arr]
    
    # 从1开始的原因是,第一列左边最大的值为其本身
    for i in range(1, len(arr)):
        lMax[i] = arr[i] if arr[i]>lMax[i-1] else lMax[i-1]
    
    # 从倒数第二列开始的原因是,最后一列右边最大的值为其本身
    for i in range(len(arr)-2, -1, -1):
        rMax[i] = arr[i] if arr[i]>rMax[i+1] else rMax[i+1]
    
    # 最后可以存水的数量就是左右列的最小值减去当前列的值总和
    for i in range(len(arr)):
        res += min(lMax[i], rMax[i]) - arr[i]
    
    return res

2.给定一个非负整数数组nums,很定最开始处于一下标为0的位置,数组里面的每个元素代表下一跳能够的跳跃的最大长度,如果可以跳到数组最后一个位置,请你求出跳跃路径中所能获得的最多的积分。
1.如果能够跳到数组最后一个位置,才能计算所获得的积分,否则积分值为-1
2.如果无法跳跃(即数组长度为0时),也请返回-1.
3.数据保证返回的结果不会超过整形范围,即不会超过2^31 - 1

输入:[2,4,2,1,0,100]

输出:106

解题思路:这是一个倒序的解法,就是从最后一个数开始,如果前面的节点可以跳到最后一个,那就说明可以加进去,即可将该节点位置进行保存。值得说明的一点是,当前节点的值为可跳跃的最大值,也就是说当前节点跳跃的值是属于[0, num[i]]之间的。因此,也更加证明了从最后一个数往前推算的必要性。

def maxJumpGrade(nums) -> int:
    if(len(nums) == 0): return -1
    reachAble = [False for _ in nums]
    # 最后一个值为真
    reachAble[-1] = True
    # 从倒数第二个值到第0个值进行遍历
    for i in range(len(nums)-2, -1, -1):
        # any函数是判断列表中至少有一个值为True,则返回True
        # 列表中的范围就是为了判断从 位置i 到 位置i+max(0,nums[i])+1 处是否有True
        # 最后+1的原因是python列表不包含右侧的值
        # max(0, nums[i])的原因是为了获取 位置i 处的值,判断从该位置 加上该位置的值之间的位置是否有True
        # 也就是是否有到达终点的路径
        reachAble[i] = any(reachAble[i: i + max(0, nums[i]) + 1])
    
    res = [n if i else 0 for i, n in zip(reachAble, nums)]

    return sum(res) if reachAble[0] else -1

你可能感兴趣的:(leetcode,数据结构)