青训营X豆包MarsCode 技术训练营第八课 |AI 刷题 小E的射击训练 题解 | 豆包MarsCode AI刷题

64 阅读3分钟

一.问题描述

小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)。