这个题目模拟的是射击靶的得分系统。给定一个射击点 (x, y),我们需要计算该点到靶心 (0, 0) 的距离,然后根据该距离返回相应的得分。
靶心到射击点的距离可以通过勾股定理来计算,具体公式为:
distance=x2+y2distance=x2+y2
根据距离的不同,得分也不同。具体得分规则如下:
- 距离在 1 以下,得 10 分;
- 距离在 1 到 2 之间,得 9 分;
- 距离在 2 到 3 之间,得 8 分;
- 依此类推,直到距离大于 10,得 0 分。
思路
-
计算距离:首先,我们需要计算点
(x, y)到靶心(0, 0)的距离。- 使用勾股定理:
distance = sqrt(x^2 + y^2)。
- 使用勾股定理:
-
判断距离:然后根据计算出来的距离判断对应的得分区间:
- 如果距离小于等于 1,返回 10 分;
- 如果距离大于 1 但小于等于 2,返回 9 分;
- 如果距离大于 2 但小于等于 3,返回 8 分;
- 以此类推,如果距离大于 10,返回 0 分。
-
返回得分:根据判断结果返回相应的得分。
代码详解
pythonCopy Code
import math
def solution(x: int, y: int) -> int:
# 计算射击点 (x, y) 到靶心 (0, 0) 的距离
distance = math.sqrt(x**2 + y**2)
# 根据距离判断得分
if distance <= 1:
return 10 # 如果距离小于等于1,得10分
elif distance <= 2:
return 9 # 如果距离小于等于2,得9分
elif distance <= 3:
return 8 # 如果距离小于等于3,得8分
elif distance <= 4:
return 7 # 如果距离小于等于4,得7分
elif distance <= 5:
return 6 # 如果距离小于等于5,得6分
elif distance <= 6:
return 5 # 如果距离小于等于6,得5分
elif distance <= 7:
return 4 # 如果距离小于等于7,得4分
elif distance <= 8:
return 3 # 如果距离小于等于8,得3分
elif distance <= 9:
return 2 # 如果距离小于等于9,得2分
elif distance <= 10:
return 1 # 如果距离小于等于10,得1分
else:
return 0 # 如果距离大于10,得0分
if __name__ == '__main__':
# 测试样例
print(solution(1, 0) == 10) # (1, 0) 距离为 1,得分为 10
print(solution(1, 1) == 9) # (1, 1) 距离为 sqrt(2),得分为 9
print(solution(0, 5) == 6) # (0, 5) 距离为 5,得分为 6
print(solution(3, 4) == 6) # (3, 4) 距离为 5,得分为 6
代码解析
-
导入 math 库:
import math:用于计算平方根,math.sqrt可以帮助我们计算射击点到靶心的距离。
-
函数
solution(x, y):-
参数:
x和y分别表示射击点在平面上的横坐标和纵坐标。 -
计算距离:通过勾股定理计算距离:
pythonCopy Code distance = math.sqrt(x**2 + y**2) -
判断得分:根据
distance的值判断应该返回的得分。- 如果距离小于等于 1,返回 10 分。
- 如果距离大于 1 小于等于 2,返回 9 分。
- 依此类推,直到超过 10 时,返回 0 分。
-
-
主程序块:
- 在
if __name__ == '__main__':中执行了四个测试用例,检查不同射击点的得分是否符合预期。
- 在
测试样例
-
solution(1, 0):(x, y) = (1, 0),距离为sqrt(1^2 + 0^2) = 1,得分为 10。
-
solution(1, 1):(x, y) = (1, 1),距离为sqrt(1^2 + 1^2) = sqrt(2),大约为 1.414,得分为 9。
-
solution(0, 5):(x, y) = (0, 5),距离为sqrt(0^2 + 5^2) = 5,得分为 6。
-
solution(3, 4):(x, y) = (3, 4),距离为sqrt(3^2 + 4^2) = 5,得分为 6。
图解
为了更直观地理解,可以画出射击点 (x, y) 到靶心 (0, 0) 的距离。假设靶心是坐标原点,得分是根据射击点到靶心的距离来决定的,具体规则如下:
-
圆的半径是 1 到 10 之间的值,表示不同的得分区域:
- 半径为 1 的圆:得分 10
- 半径为 2 的圆:得分 9
- 半径为 3 的圆:得分 8
- ...
- 半径为 10 的圆:得分 1
- 超过半径 10 的点,得分为 0
复杂度分析
- 时间复杂度:每次调用
solution(x, y)函数时,计算距离只需要常数时间(O(1)),因此整个函数的时间复杂度是O(1)。 - 空间复杂度:除了存储输入和计算的距离外,程序只使用了常数的额外空间,因此空间复杂度也是
O(1)。
总结
这个程序通过计算射击点到靶心的距离来决定得分。代码清晰简洁,按照给定的规则正确地计算出得分。根据不同的测试输入,程序可以快速给出准确的结果。