游戏英雄升级潜力评估(GO)| 豆包MarsCode AI刷题

41 阅读3分钟

问题描述

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

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

输入输出

  • 输入

    • n:英雄的数量。
    • u:一个包含 n 个整数的数组,表示每个英雄的初始等级。
  • 输出

    • 一个整数,表示有多少英雄有潜力通过历练达到 2000000000000000 级。

测试样例

  • 样例1

    • 输入:n = 5, u = [1, 2, 3, 1, 2]
    • 输出:3
    • 解释:等级为 3 的英雄可以通过历练达到 2000000000000000 级。
  • 样例2

    • 输入:n = 4, u = [100000, 100000, 100000, 100000]
    • 输出:0
    • 解释:所有英雄的等级相同,无法通过历练提升等级。
  • 样例3

    • 输入:n = 6, u = [1, 1, 1, 2, 2, 2]
    • 输出:3
    • 解释:等级为 2 的英雄可以通过历练达到 2000000000000000 级。

思路解析

1. 排序

首先,我们可以对 u 数组进行排序。排序后,等级较高的英雄会出现在数组的末尾。

2. 遍历查找

从数组的末尾开始遍历,找到第一个等级与数组中最小等级相同的英雄。所有等级高于这个最小等级的英雄都有潜力通过历练达到 2000000000000000 级。

3. 计算潜力英雄数量

从数组的末尾开始,统计等级高于最小等级的英雄数量。

代码实现

go

复制

package main

import (
	"fmt"
	"sort"
)

func solution(n int, u []int) int {
    // 对英雄等级进行排序
    sort.Ints(u)
    
    // 初始化计数器
    count := 0
    
    // 从数组末尾开始遍历
    for i := n - 1; i >= 0; i-- {
        // 如果当前英雄等级大于数组中最小等级,则计数器加1
        if u[i] > u[0] {
            count++
        } else {
            // 如果遇到第一个等级与最小等级相同的英雄,跳出循环
            break
        }
    }
    
    // 返回有潜力的英雄数量
    return count
}

func main() {
    fmt.Println(solution(5, []int{1, 2, 3, 1, 2}))  // 输出: 3
    fmt.Println(solution(4, []int{100000, 100000, 100000, 100000}))  // 输出: 0
    fmt.Println(solution(6, []int{1, 1, 1, 2, 2, 2}))  // 输出: 3
}

代码解析

  1. 排序

    • 使用 sort.Ints 对 u 数组进行排序,使得等级较高的英雄出现在数组的末尾。
  2. 遍历查找

    • 从数组的末尾开始遍历,使用 for i := n - 1; i >= 0; i-- 循环。
    • 如果当前英雄等级 u[i] 大于数组中最小等级 u[0],则计数器 count 加1。
    • 如果遇到第一个等级与最小等级相同的英雄,跳出循环。
  3. 返回结果

    • 返回计数器 count,表示有潜力的英雄数量。

总结

通过上述方法,我们可以高效地计算出有多少英雄有潜力通过历练达到 2000000000000000 级。该方法的时间复杂度为 O(n log n),其中 n 是英雄的数量。这种方法在处理大规模数据时也能保持较高的效率。