豆包 Mars Code刷题 | 机器人能量冒险

130 阅读6分钟

一、问题重述


问题描述

小R设计了一款有趣的机器人,它每次移动时至少需要消耗一个能量值。假设当小R为机器人提供了 5 个能量值,它可以选择不动,也可以走 1 步,但它不会走超过 5 步。
小R希望机器人能够走到一个终点,该终点位于 N 个位置的最后一个位置。每个位置上都有一定的能量值,机器人每次消耗当前位置的能量值可以往前走几步,之后可以继续消耗新的位置的能量继续前进。如果某个位置的能量值为 0,机器人将无法再继续行动。
小R想知道,机器人是否有可能通过这些能量值移动到最后一个位置。你能帮他计算一下吗?


测试样例

样例1:

输入:n = 5 ,array = [2, 3, 1, 1, 4]
输出:'TRUE'

样例2:

输入:n = 5 ,array = [3, 2, 1, 0, 4]
输出:'FALSE'

样例3:

输入:n = 6 ,array = [1, 2, 3, 4, 0, 0]
输出:'TRUE'

二、代码讲解


def solution(n, array):
    # 初始化能够到达的最远位置
    max_reach = 0
    
    # 遍历数组中的每个位置
    for i in range(n):
        # 如果当前位置超过了能够到达的最远位置,返回 'FALSE'
        if i > max_reach:
            return "FALSE"
        
        # 更新能够到达的最远位置
        max_reach = max(max_reach, i + array[i])
    
    # 如果能够到达数组的最后一个位置,返回 'TRUE'
    return "TRUE" if max_reach >= n - 1 else "FALSE"

if __name__ == "__main__":
    # Add your test cases here
    print(solution(5, [2, 3, 1, 1, 4]) == "TRUE")
    print(solution(5, [3, 2, 1, 0, 4]) == "FALSE")

三、思路提示


机器人需要从数组的第一个位置开始,通过消耗当前位置的能量值来决定可以前进的步数。目标是判断机器人是否能够到达数组的最后一个位置。

数据结构选择

我们可以使用一个变量来跟踪当前能够到达的最远位置。

算法步骤

  1. 初始化一个变量 max_reach 来表示当前能够到达的最远位置,初始值为0。

  2. 遍历数组中的每个位置:

    • 如果当前位置超过了 max_reach,说明无法到达当前位置,返回 'FALSE'
    • 更新 max_reach 为当前位置加上当前位置的能量值和 max_reach 中的较大值。
  3. 如果遍历结束后,max_reach 大于等于数组的最后一个位置,返回 'TRUE',否则返回 'FALSE'

关键步骤解释

  1. max_reach = 0:初始化能够到达的最远位置。
  2. for i in range(n):遍历数组中的每个位置。
  3. if i > max_reach:如果当前位置超过了能够到达的最远位置,说明无法到达当前位置,返回 'FALSE'
  4. max_reach = max(max_reach, i + array[i]):更新能够到达的最远位置。
  5. return "TRUE" if max_reach >= n - 1 else "FALSE":如果能够到达数组的最后一个位置,返回 'TRUE',否则返回 'FALSE'

四、改进


如何处理数组中能量值为0的情况? 处理数组中能量值为0的情况是这个问题的关键之一。当机器人遇到能量值为0的位置时,它将无法继续前进,因此我们需要在代码中特别处理这种情况。

解题思路

  1. 遍历数组:在遍历数组的过程中,我们需要检查每个位置的能量值。
  2. 能量值为0的处理:如果当前位置的能量值为0,我们需要判断机器人是否能够跳过这个位置。如果当前位置的能量值为0且机器人无法跳过这个位置(即 max_reach 小于当前位置的索引),则机器人无法到达终点,返回 'FALSE'
def solution(n, array):
    # 初始化能够到达的最远位置
    max_reach = 0
    
    # 遍历数组中的每个位置
    for i in range(n):
        # 如果当前位置超过了能够到达的最远位置,返回 'FALSE'
        if i > max_reach:
            return "FALSE"
        
        # 更新能够到达的最远位置
        max_reach = max(max_reach, i + array[i])
        
        # 如果当前位置的能量值为0且无法跳过这个位置,返回 'FALSE'
        if array[i] == 0 and max_reach <= i:
            return "FALSE"
    
    # 如果能够到达数组的最后一个位置,返回 'TRUE'
    return "TRUE" if max_reach >= n - 1 else "FALSE"

if __name__ == "__main__":
    # Add your test cases here
    print(solution(5, [2, 3, 1, 1, 4]) == "TRUE")
    print(solution(5, [3, 2, 1, 0, 4]) == "FALSE")

处理数组中能量值为0的情况是这个问题的关键之一。当机器人遇到能量值为0的位置时,它将无法继续前进,因此我们需要在代码中特别处理这种情况。

解题思路

  1. 遍历数组:在遍历数组的过程中,我们需要检查每个位置的能量值。
  2. 能量值为0的处理:如果当前位置的能量值为0,我们需要判断机器人是否能够跳过这个位置。如果当前位置的能量值为0且机器人无法跳过这个位置(即 max_reach 小于当前位置的索引),则机器人无法到达终点,返回 'FALSE'

代码提示

我们可以对当前代码进行如下修改,以处理能量值为0的情况:

def solution(n, array):
    # 初始化能够到达的最远位置
    max_reach = 0
    
    # 遍历数组中的每个位置
    for i in range(n):
        # 如果当前位置超过了能够到达的最远位置,返回 'FALSE'
        if i > max_reach:
            return "FALSE"
        
        # 更新能够到达的最远位置
        max_reach = max(max_reach, i + array[i])
        
        # 如果当前位置的能量值为0且无法跳过这个位置,返回 'FALSE'
        if array[i] == 0 and max_reach <= i:
            return "FALSE"
    
    # 如果能够到达数组的最后一个位置,返回 'TRUE'
    return "TRUE" if max_reach >= n - 1 else "FALSE"

if __name__ == "__main__":
    # Add your test cases here
    print(solution(5, [2, 3, 1, 1, 4]) == "TRUE")
    print(solution(5, [3, 2, 1, 0, 4]) == "FALSE")

关键步骤解释

  1. if i > max_reach:如果当前位置超过了能够到达的最远位置,说明无法到达当前位置,返回 'FALSE'
  2. max_reach = max(max_reach, i + array[i]):更新能够到达的最远位置。
  3. if array[i] == 0 and max_reach <= i:如果当前位置的能量值为0且无法跳过这个位置,返回 'FALSE'

通过这种方式,我们可以确保在遇到能量值为0的位置时,机器人能够正确判断是否能够继续前进。


好了本次分享就到这里了。如果对我感兴趣,可以关注我的GitHub。 也可以加我的飞书一起交流。