青训营X豆包MarsCode技术训练营|豆包MarsCode AI刷题

4 阅读3分钟

问题描述

小U正沿着一条环形公路行走,公路上有 nn 个站点,每个相邻站点之间都有已知的顺时针距离。她需要从站点 xx 走到站点 yy,并且想知道从站点 xx 到站点 yy 的最短距离。

公路是环形的,因此从 xx 到 yy 可以顺时针或逆时针行走。你需要计算小U走的最短距离。


测试样例

样例1:

输入:n = 3, a = [1, 2, 2], x = 2, y = 3
输出:2

样例2:

输入:n = 3, a = [1, 2, 2], x = 1, y = 3
输出:2

样例3:

输入:n = 4, a = [3, 5, 7, 2], x = 1, y = 4
输出:2

代码思路:

由于最后一句:公路是环形的,因此从 xx 到 yy 可以顺时针或逆时针行走。不妨这样思考代码要实现的功能:计算顺时针的距离,再计算逆时针的距离,然后将两者进行比较,这样就得到初步代码内容。

def solution(n: int, a: list, x: int, y: int) -> int:

# 计算顺时针距离
clockwise_distance = sum(a[(x-1):(y-1)]) if x < y else sum(a[(x-1):n] + a[0:(y-1)])

# 计算逆时针距离
total_distance = sum(a)  # 总距离
counterclockwise_distance = total_distance - clockwise_distance

# 返回最短距离
return min(clockwise_distance, counterclockwise_distance)

if __name__ == '__main__':
print(solution(3, [1, 2, 2], 2, 3) == 2)
print(solution(3, [1, 2, 2], 1, 3) == 2)
print(solution(4, [3, 5, 7, 2], 1, 4) == 2)

但是很可惜,代码并不如思路一般顺畅,出乎意料地报错了。

这时我们使用AI刷题的功能:思路提示

问题理解

小U需要在一个环形公路上从一个站点走到另一个站点,并且可以选择顺时针或逆时针方向。我们需要计算出这两种路径中最短的那一条。

数据结构选择

  • 站点之间的距离可以用一个列表 a 来表示,其中 a[i] 表示从站点 i 到站点 i+1 的距离。
  • 由于公路是环形的,站点 n 到站点 1 的距离可以通过 a[n-1] 来表示。

算法步骤

  1. 计算顺时针距离

    • 如果 x < y,直接计算从 x 到 y 的距离。
    • 如果 x > y,需要考虑从 x 到 n 再到 1 再到 y 的距离。
  2. 计算逆时针距离

    • 逆时针距离可以通过总距离减去顺时针距离来计算。
  3. 比较两种距离

    • 返回顺时针距离和逆时针距离中的较小值。

关键点

  • 确保正确处理环形结构,特别是当 x > y 时的情况。
  • 计算总距离时,注意环形的特性。

这时再放回我们的代码部分,不难发现我们需要修正 x > y 时顺时针距离的计算逻辑,确保正确处理环形结构。这样就能得到最终的代码答案了

def solution(n: int, a: list, x: int, y: int) -> int:
# 计算顺时针距离
if x < y:
    clockwise_distance = sum(a[(x-1):(y-1)])
else:
    clockwise_distance = sum(a[(x-1):]) + sum(a[:(y-1)])

# 计算逆时针距离
total_distance = sum(a)  # 总距离
counterclockwise_distance = total_distance - clockwise_distance

# 返回最短距离
return min(clockwise_distance, counterclockwise_distance)

if __name__ == '__main__':
print(solution(3, [1, 2, 2], 2, 3) == 2)
print(solution(3, [1, 2, 2], 1, 3) == 2)
print(solution(4, [3, 5, 7, 2], 1, 4) == 2)