Bootstrap

27游戏英雄升级潜力评估-青训营刷题

问题描述

小U在一款挂机游戏中拥有n个英雄。游戏中有一种历练升级机制,每天可以选择两个英雄进行历练,如果两位英雄的等级相同,则他们的等级都不会改变。如果英雄等级不同,那么等级较高的英雄会增加1级,而等级较低的英雄则保持不变。

小U希望至少有一个英雄能够达到2000000000000000级,他想知道有多少英雄有潜力通过历练达到这个等级。


测试样例

样例1:

输入:n = 5 ,u = [1, 2, 3, 1, 2]
输出:3

样例2:

输入:n = 4 ,u = [100000, 100000, 100000, 100000]
输出:0

样例3:

输入:n = 6 ,u = [1, 1, 1, 2, 2, 2]
输出:3

代码如下:

import java.util.*;

public class Main {
    public static void main(String[] args) {
        System.out.println(solution(5, new int[]{1, 2, 3, 1, 2}) == 3);
        System.out.println(solution(4, new int[]{100000, 100000, 100000, 100000}) == 0);
        System.out.println(solution(6, new int[]{1, 1, 1, 2, 2, 2}) == 3);
    }

    public static int solution(int n, int[] u) {
        // Sort the array
        Arrays.sort(u);

        int ans = 0, t = 0;
        t = u[0];
        for (int i = 0; i < u.length; i++) {
            if (u[i] != t) {
                ans = n - i;
                break;
            }
        }
        return ans;
    }
}

 代码解释:

这段代码的功能是计算一个整数数组中,从第一个与数组第一个元素不同的元素开始到数组末尾的元素个数。如果数组中所有元素都相同,则返回0。以下是对代码的详细解释:

1. 主函数 main

java复制

public static void main(String[] args) {
    System.out.println(solution(5, new int[]{1, 2, 3, 1, 2}) == 3);
    System.out.println(solution(4, new int[]{100000, 100000, 100000, 100000}) == 0);
    System.out.println(solution(6, new int[]{1, 1, 1, 2, 2, 2}) == 3);
}
  • main 方法是程序的入口。

  • 它调用了 solution 方法三次,分别传入不同的测试用例,并打印出结果是否符合预期。

  • 每次调用 solution 方法后,使用 == 比较返回值是否等于预期值,然后输出布尔值(truefalse)。

2. solution 方法

java复制

public static int solution(int n, int[] u) {
    // Sort the array
    Arrays.sort(u);

    int ans = 0, t = 0;
    t = u[0];
    for (int i = 0; i < u.length; i++) {
        if (u[i] != t) {
            ans = n - i;
            break;
        }
    }
    return ans;
}
功能
  • 输入参数

    • n:数组的长度。

    • u:一个整数数组。

  • 输出

    • 返回从第一个与数组第一个元素不同的元素开始到数组末尾的元素个数。如果数组中所有元素都相同,则返回0。

实现逻辑
  1. 排序

    java复制

    Arrays.sort(u);
    • 使用 Arrays.sort 方法对数组 u 进行升序排序。排序后,相同的元素会聚集在一起。

  2. 初始化变量

    java复制

    int ans = 0, t = 0;
    t = u[0];
    • ans 用于存储最终结果。

    • t 用于存储数组的第一个元素(排序后数组的第一个元素)。

  3. 遍历数组

    java复制

    for (int i = 0; i < u.length; i++) {
        if (u[i] != t) {
            ans = n - i;
            break;
        }
    }
    • 遍历排序后的数组 u

    • 如果当前元素 u[i] 不等于 t(即第一个元素),说明找到了第一个与第一个元素不同的元素。

    • 计算从这个不同元素开始到数组末尾的元素个数:n - in 是数组长度,i 是当前索引)。

    • 使用 break 退出循环,因为已经找到了第一个不同的元素。

  4. 返回结果

    java复制

    return ans;
    • 如果数组中所有元素都相同,循环不会中断,ans 保持为0。

    • 如果找到了不同的元素,返回计算的结果 ans

3. 测试用例解释

测试用例1

java复制

System.out.println(solution(5, new int[]{1, 2, 3, 1, 2}) == 3);
  • 输入数组:{1, 2, 3, 1, 2}

  • 排序后:{1, 1, 2, 2, 3}

  • 第一个与第一个元素(1)不同的元素是2,位置在索引2。

  • 从索引2到末尾的元素个数:5 - 2 = 3

  • 输出:true

测试用例2

java复制

System.out.println(solution(4, new int[]{100000, 100000, 100000, 100000}) == 0);
  • 输入数组:{100000, 100000, 100000, 100000}

  • 排序后:{100000, 100000, 100000, 100000}

  • 所有元素都相同,没有找到不同的元素。

  • 输出:true

测试用例3

java复制

System.out.println(solution(6, new int[]{1, 1, 1, 2, 2, 2}) == 3);
  • 输入数组:{1, 1, 1, 2, 2, 2}

  • 排序后:{1, 1, 1, 2, 2, 2}

  • 第一个与第一个元素(1)不同的元素是2,位置在索引3。

  • 从索引3到末尾的元素个数:6 - 3 = 3

  • 输出:true

总结

这段代码通过排序和遍历数组,找到第一个与第一个元素不同的位置,并计算从该位置到数组末尾的元素个数。如果数组中所有元素都相同,则返回0。

;