题目描述: 小E正在进行射击练习,靶心在坐标 (0, 0),靶有 10 个环,每个环对应不同的得分。根据射击点到靶心的距离,得分逐渐递减。靶心内(半径为1)得 10 分,依次向外的每个环分数减少 1 分。如果射击点超出所有的环,则得 0 分。 思路:
计算射击点 (x, y) 到靶心 (0, 0) 的距离,即 (x, y) 的欧几里得距离。 根据该距离判断射击点所在的环,并返回相应的得分: 距离小于等于 1,得 10 分。 距离大于 1 小于等于 2,得 9 分,依此类推。 如果距离大于 10,得 0 分。
import math
def solution(x: int, y: int) -> int: # 计算射击点到靶心的距离 distance = math.sqrt(x2 + y2)
# 根据距离计算得分
if distance <= 1:
return 10
elif distance <= 2:
return 9
elif distance <= 3:
return 8
elif distance <= 4:
return 7
elif distance <= 5:
return 6
elif distance <= 6:
return 5
elif distance <= 7:
return 4
elif distance <= 8:
return 3
elif distance <= 9:
return 2
elif distance <= 10:
return 1
else:
return 0
if name == 'main': print(solution(1, 0) == 10) # 射击点(1, 0)离靶心的距离是1,得分10 print(solution(1, 1) == 9) # 射击点(1, 1)离靶心的距离是√2 ≈ 1.41,得分9 print(solution(0, 5) == 6) # 射击点(0, 5)离靶心的距离是5,得分6 print(solution(3, 4) == 6) # 射击点(3, 4)离靶心的距离是5,得分6
代码分析 math.sqrt(x2 + y2):
通过这个公式计算射击点 (x, y) 到靶心 (0, 0) 的欧几里得距离。该计算将坐标 (x, y) 转换为一个标量,表示射击点离靶心的直线距离。 条件判断:
使用 if 条件语句判断射击点的距离,分别对应不同的得分范围: 距离小于等于 1,得 10 分; 距离大于 1 小于等于 2,得 9 分; 如此类推,直到距离大于 10,得 0 分。 返回值:
根据射击点的距离,返回对应的得分。
总结的新知识点 条件判断的应用: 使用 if-elif-else 语句来根据不同的距离范围返回不同的得分。这是处理分段函数的一种常见方法。 代码优化: 如果得分的计算规则比较简单,可以使用 if-elif-else 结构来逐层判断,直接返回对应的结果。对于本题而言,这种方式直观且易于理解。 对入门同学的学习建议 加强数学基础:
本题涉及到欧几里得距离的计算,理解并熟练掌握如何使用公式计算两点间的距离,是编程中非常常见的一个应用。 练习条件判断:
多做一些分段条件判断的题目,熟悉如何根据不同条件返回不同结果,这是常见的编程基础。 编写清晰的代码:
在解题时,注重代码的清晰性和可读性。对于简单的问题,尽量使用简洁的结构,避免复杂的逻辑,使得代码容易理解。 高效学习方法 结合 豆包MarsCode AI 刷题功能,以下是我的高效学习方法:
制定学习计划:
可以将题目分为不同难度,逐步提高难度,从基础的数学计算、字符串操作到更复杂的算法和数据结构题目。 刷题时可以先做简单的题目,确保理解每个题目的核心思想后再做复杂题目。 利用错题进行针对性学习:
每次做错题后,MarsCode AI 会为你记录错误的题目,你可以集中时间复习错题,查找错误原因,进行改进。 对于错题,重点分析自己的思路错误,是否有解题思路上的漏洞,或者基础知识的薄弱。 利用AI推荐题目:
利用MarsCode AI的题目推荐功能,根据自己的进度,系统推荐适合的题目,避免做重复的题目,保持高效学习。 结合多平台学习资源:
结合 MarsCode AI 和其他平台如 LeetCode、力扣等,拓展题库,学习不同的解法,帮助你在最短的时间内掌握更多的知识点和技巧。