一.问题描述
小E正在训练场进行射击练习,靶有10个环,靶心位于坐标(0, 0)。每个环对应不同的得分,靶心内(半径为1)得10分,依次向外的每个环分数减少1分。若射击点在某个半径为i的圆内,则得11-i分。如果射击点超出所有的环,则得0分。
根据给定的射击坐标(x, y),请计算小E的射击得分。
二.思路分析
1. 关键点
Math.sqrt(Math.pow(x,2) + Math.pow(y,2));
2. 理解靶心和环的得分规则
靶心位于坐标(0, 0)。
靶心有10个环,从靶心开始,每个环向外扩展,半径依次增加。
靶心内(半径为1的圆内)得10分。
半径为2的圆内(不包括半径为1的圆)得9分。
半径为3的圆内(不包括半径为2的圆)得8分。
依此类推,直到半径为9的圆内得1分。
如果射击点超出半径为9的圆,则得0分。
3. 计算射击点到靶心的公式
公式为distance=sqrt(x^2+y^2)
4. 根据距离确定得分
如果距离小于1,则射击点在靶心内,得10分。
如果距离大于等于1且小于2,则射击点在第一环内(不包括靶心),得9分。
如果距离大于等于2且小于3,则射击点在第二环内,得8分。
依此类推,直到距离大于等于9,则射击点超出所有环,得0分。
5. 实现逻辑
由于JAVA中对于根号的计算有已经写好的方法,因此我们只需要调用即可。所以为解决这个问题,我们可以直接使用一个简单的条件判断来实现。
6.举例
下面是一个具体的例子:
假设小E的射击坐标为(x, y) = (3, 4)。
计算距离:d=32+42=9+16=25=5d=32+42=9+16=25=5。
确定环:因为 4<d≤54<d≤5,所以射击点在第5个环内。
计算得分:第5个环的得分为 11−5=611−5=6。
因此,小E的射击得分为6分。
这个思路可以用来计算任何给定坐标(x, y)的射击得分。
三.代码实现
public static int solution(int x, int y) {
double num = Math.sqrt(Math.pow(x, 2) + Math.pow(y, 2));
if (num <= 1) {
return 10;
} else if (num <= 2) {
return 9;
} else if (num <= 3) {
return 8;
} else if (num <= 4) {
return 7;
} else if (num <= 5) {
return 6;
} else if (num <= 6) {
return 5;
} else if (num <= 7) {
return 4;
} else if (num <= 8) {
return 3;
} else if (num <= 9) {
return 2;
} else if (num <= 10) {
return 1;
}
return 0;
}
四.复杂度
1. 时间复杂度:O(1)
方法通过一系列的if-else语句来判断距离所属的区间,以确定得分。这些判断操作都是O(1)的复杂度。
2. 空间复杂度:O(1)
该方法使用了几个局部变量来存储计算过程中的中间结果,包括存储距离的num变量和可能返回的得分。这些变量的数量是固定的,不随输入的大小而变化。
此外,方法没有使用任何额外的数据结构(如数组、列表或哈希表)来存储数据。
因此,整个方法的空间复杂度也是O(1)。