做题体验(2)| 豆包MarsCode AI刷题

51 阅读3分钟

昨天发了一篇豆包AI的做题体验,我们做了一道简单题,今天就来一道中等题来练练手叭~

英雄决斗的最大胜利次数

问题描述

小U和小F正在进行一场由 nn 轮组成的英雄决斗比赛。在每一轮中,小U和小F各自从他们的英雄队伍中选出一位英雄进行对决,英雄的能力值将决定比赛的胜负,能力值高者获胜。小U已经按照固定的能力顺序 1,2,3,…,n1,2,3,…,n 安排了他的英雄出场顺序。

小F希望通过调整他的英雄出场顺序,最大化他的获胜轮数。请帮助小 F 确定一个最佳的出场顺序,以获得最多的胜利。

输入说明

  • number: 一个整数,表示比赛的总轮数 nn。
  • heroes: 一个长度为 nn 的正整数数组,表示小 F 的每个英雄的能力值。

输出

  • 返回一个整数,表示小 F 可以获得的最大胜利轮数。

测试样例

样例1:

输入:number = 7, heroes = [10, 1, 1, 1, 5, 5, 3]
输出:4

样例2:

输入:number = 5, heroes = [1, 1, 1, 1, 1]
输出:0

样例3:

输入:number = 6, heroes = [9, 4, 7, 3, 2, 6]
输出:6

这道题做题大致的思路就是先进行排序,然后使用双指针遍历。这道题给我的感觉就是直接去构思,然后写出来。我把每道题的思路写在了代码里。

import java.util.Arrays;

public class Main {
    public static int solution(int number, int[] heroes) {
        // Step 1: 对小F的英雄能力值进行升序排序
        Arrays.sort(heroes);
        
        int uPointer = 1;  // 小U的英雄能力值从 1 开始
        int fPointer = 0;  // 小F的英雄数组指针
        int winCount = 0;  // 记录小F获胜的轮数

        // Step 2: 使用双指针遍历
        while (uPointer <= number && fPointer < number) {
            // 如果小F的当前英雄能力值大于小U的当前英雄
            if (heroes[fPointer] > uPointer) {
                winCount++;  // 小F赢得一轮
                uPointer++;  // 小U指针移到下一个英雄
            }
            fPointer++;  // 小F指针移到下一个英雄
        }
        
        return winCount;
    }

    public static void main(String[] args) {
        // 测试样例
        System.out.println(solution(7, new int[]{10, 1, 1, 1, 5, 5, 3}) == 4);
        System.out.println(solution(5, new int[]{1, 1, 1, 1, 1}) == 0);
        System.out.println(solution(6, new int[]{9, 4, 7, 3, 2, 6}) == 6);
    }
}

核心思路:

  1. 排序:首先对小F的英雄能力值数组进行升序排序。这样我们可以从小到大依次安排小F的英雄出场。
  2. 双指针遍历:使用两个指针,一个指向小U的英雄能力值(从1开始),另一个指向小F的英雄能力值数组。
  3. 比较与计数:遍历过程中,比较小F当前英雄的能力值与小U当前英雄的能力值。如果小F的英雄能力值大于小U的英雄能力值,则小F获胜,计数器加1,并且两个指针都向前移动。否则,只移动小F的指针。