青训营X豆包MarsCode技术训练营学习体验|豆包MarsCode AI 刷题

43 阅读5分钟

1.问题描述

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

2.遍历数组: 我们使用一个 while 循环来遍历数组,直到 current_position 超过 max_reach

3.更新最大可达位置: 在每次循环中,我们更新 max_reach 为当前位置加上当前位置的能量值,即 current_position + array[current_position]

4.判断是否到达终点: 如果 max_reach 已经覆盖或超过终点(即 n - 1),则返回 "TRUE"

5.移动到下一个位置: 如果未到达终点,则将 current_position 加1,继续遍历。

6.返回结果: 如果遍历完所有可能的位置仍未到达终点,则返回 "FALSE"

** 代码:**

def solution(n, array):
# 初始化当前位置为0,最大可达位置为0
current_position = 0
max_reach = 0

# 遍历数组,直到当前位置达到或超过最大可达位置
while current_position <= max_reach:
    # 更新最大可达位置
    max_reach = max(max_reach, current_position + array[current_position])
    
    # 如果最大可达位置已经覆盖或超过终点,返回TRUE
    if max_reach >= n - 1:
        return "TRUE"
    
    # 移动到下一个位置
    current_position += 1

# 如果遍历完所有可能的位置仍未到达终点,返回FALSE
return "FALSE"

if __name__ == "__main__":
# 添加测试用例
print(solution(5, [2, 3, 1, 1, 4]) == "TRUE")
print(solution(5, [3, 2, 1, 0, 4]) == "FALSE")
print(solution(6, [1, 2, 3, 4, 0, 0]) == "TRUE")

这个算法的时间复杂度为 O(n),空间复杂度为 O(1)。

2.问题描述

在某个项目中,每个版本都用版本号标记,由一个或多个修订号组成,修订号之间由点号.分隔。每个修订号可能有多位数字,并且可能会包含前导零。你需要根据两个版本号 version1 和 version2,判断哪个版本更新,或者它们是否相同。

例如,2.5.33 和 0.1 都是有效的版本号。

当比较两个版本时,从左到右依次比较它们的修订号。忽略每个修订号的前导零,直接比较修订号对应的整数值。如果其中一个版本没有足够的修订号,缺失部分默认补为0

你需要根据以下规则返回比较结果:

如果 version1 > version2,返回 1。 如果 version1 < version2,返回 -1。 如果两个版本相等,返回 0

解题思路:

1.分割版本号:

将 version1 和 version2 按照点号 . 分割成修订号列表。

1.补齐修订号:

比较两个修订号列表的长度,如果长度不一致,将较短的列表用 0 补齐,使得两个列表长度相同。

3.逐个比较修订号:

从左到右依次比较修订号列表中的每个修订号。 忽略前导零,直接比较修订号的整数值。 如果遇到不相等的修订号,根据比较结果返回 1 或 -1

4.判断相等:

如果所有修订号都相等,则返回 0

代码如下:

def solution(version1, version2):
  # 将版本号分割成修订号列表
  v1_parts = version1.split('.')
  v2_parts = version2.split('.')

# 补齐修订号列表
max_len = max(len(v1_parts), len(v2_parts))
v1_parts += ['0'] * (max_len - len(v1_parts))
v2_parts += ['0'] * (max_len - len(v2_parts))

# 逐个比较修订号
for i in range(max_len):
    # 将修订号转换为整数进行比较
    v1_num = int(v1_parts[i])
    v2_num = int(v2_parts[i])
    
    if v1_num > v2_num:
        return 1
    elif v1_num < v2_num:
        return -1

# 如果所有修订号都相等,返回 0
return 0
具体步骤:

1.分割版本号:

使用 split('.') 方法将版本号字符串分割成修订号列表。

2.补齐修订号:

使用列表的 + 操作符和 ['0'] * (max_len - len(v1_parts)) 来补齐修订号列表。

3.逐个比较修订号:

使用 int() 函数将修订号字符串转换为整数进行比较。 使用 if-elif-else 结构来判断比较结果并返回相应的值。

做题收获:

通过解决这个版本号比较的问题,我学到了以下几点: 字符串处理技巧:学会了如何使用 split 方法将字符串按照特定字符(如点号 .)分割成列表。掌握了如何使用 int 函数将字符串转换为整数,以便进行数值比较。 列表操作:熟悉了列表的 + 操作符,用于在列表末尾添加元素,从而补齐修订号列表。学会了使用 max 函数来确定两个列表的最大长度,以便进行补齐操作。 逻辑思维:锻炼了从左到右逐个比较元素的逻辑思维,特别是在处理不同长度的列表时,如何补齐缺失部分。理解了在比较过程中如何处理前导零,确保比较的是修订号的实际数值。 边界条件处理:学会了如何处理不同长度的版本号,确保在比较时不会因为长度不一致而出现错误。掌握了如何处理所有修订号都相等的情况,返回正确的结果。