问题描述
小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]
来表示。
算法步骤
-
计算顺时针距离:
- 如果
x < y
,直接计算从x
到y
的距离。 - 如果
x > y
,需要考虑从x
到n
再到1
再到y
的距离。
- 如果
-
计算逆时针距离:
- 逆时针距离可以通过总距离减去顺时针距离来计算。
-
比较两种距离:
- 返回顺时针距离和逆时针距离中的较小值。
关键点
- 确保正确处理环形结构,特别是当
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)