青训营X豆包MarsCode技术训练营伴学笔记|实践记录以及工具使用(2)|豆包MarsCode AI刷题

130 阅读5分钟

在这篇伴学笔记中,我想对使用豆包MarsCode AI刷题平台的几个功能进行总结与整理。 下面我将用一道具体的算法题进行举例说明。 选用的题目为64.英雄决斗的最大胜利次数

问题描述

小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

看到这一样一道题目我们要是毫无思路可以先用豆包的AI思路提示功能先给自己一个初步的思路方向,然后说顺着这个思路方向我们可以自己接着去完善 下面我们看看豆包给我们的思路提示

问题理解

小U的英雄出场顺序是固定的,能力值为 1, 2, 3, ..., n。小F需要通过调整他的英雄出场顺序,最大化他的获胜轮数。

数据结构选择

  • 小F的英雄能力值数组 heroes 需要进行排序,以便我们可以更方便地进行匹配。

算法步骤

  1. 排序:首先对小F的英雄能力值数组 heroes 进行升序排序。

  2. 双指针法:使用两个指针 ij,分别指向小U和小F的英雄。

    • i 从小U的英雄能力值 1 开始,逐步增加。
    • j 从小F的英雄能力值数组的最小值开始,逐步增加。
  3. 匹配策略

    • 如果小F的英雄能力值 heroes[j] 大于小U的英雄能力值 i,则小F获胜,victories 计数加1,两个指针都向前移动。
    • 如果小F的英雄能力值 heroes[j] 小于或等于小U的英雄能力值 i,则小F的英雄无法获胜,j 指针向前移动,尝试用更强的英雄来匹配。

关键点

  • 通过排序和双指针法,可以有效地找到小F的最佳出场顺序,从而最大化获胜轮数。

到这一步我们便可以自己开始动手开始写代码了、当然有些新手代码能力偏弱。可以让豆包给你一些代码提示。豆包不会给你完整的代码。但会给你一个代码框架。你在这个代码框架下面写会很容易完成题目。不至于一道题目卡半天。

下面我们看看豆包给的代码提示

代码提示

def solution(number, heroes):
    # 小F的英雄按能力升序排列
    heroes.sort()
    
    # 双指针初始化
    i, j = 0, 0
    victories = 0
    
    # 按顺序遍历小U的英雄
    while i < number and j < number:
        if heroes[j] > i + 1:
            # 如果小F的英雄能战胜小U的英雄
            victories += 1
            j += 1
            i += 1
        else:
            # 如果不能胜过,那么小F本轮派出最弱的以策略性放弃
            j += 1
    
    return victories

if __name__ == "__main__":
    #  You can add more test cases here
    print(solution(7, [10,1,1,1,5,5,3]) == 4 )
    print(solution(5, [1,1,1,1,1]) == 0 )
    print(solution(10, [1,2,3,4,5,6,7,8,9,10]) == 9 )

关键步骤提示

  1. 排序

    • 你已经正确地对 heroes 数组进行了排序。
  2. 双指针法

    • i 指针表示小U的英雄能力值,从 1 开始,逐步增加。
    • j 指针表示小F的英雄能力值,从排序后的 heroes 数组的最小值开始,逐步增加。
  3. 匹配策略

    • 如果 heroes[j] > i + 1,表示小F的英雄能战胜小U的英雄,victories 计数加1,两个指针都向前移动。
    • 如果 heroes[j] <= i + 1,表示小F的英雄无法获胜,j 指针向前移动,尝试用更强的英雄来匹配。

代码优化提示

  • 你可以考虑在 while 循环中增加一些边界条件的检查,以确保代码的健壮性。
  • 你可以尝试在 if 语句中增加一些调试信息,以便更好地理解代码的执行过程。 豆包不仅会给代码提示还会同时给文字分析,极大帮助了新手学习。 通过以上提示我们很快就掌握了这个题目的意思。并写出了代码。这样写代码是不是效率很高。很开心

完整代码

def solution(number, heroes):

    # 小F的英雄按能力升序排列

    heroes.sort()

   

    # 双指针初始化

    i, j = 0, 0

    victories = 0

   

    # 按顺序遍历小U的英雄

    while i < number and j < number:

        if heroes[j] > i + 1:

            # 如果小F的英雄能战胜小U的英雄

            victories += 1

            j += 1

            i += 1

        else:

            # 如果不能胜过,那么小F本轮派出最弱的以策略性放弃

            j += 1

   

    return victories

  


if __name__ == "__main__":

    #  You can add more test cases here

    print(solution(7, [10,1,1,1,5,5,3]) == 4 )

    print(solution(5, [1,1,1,1,1]) == 0 )

    print(solution(10, [1,2,3,4,5,6,7,8,9,10]) == 9 )

总结

通过豆包MarsCode AI刷题平台,我们可以看到AI刷题的强大之处,它不仅向我们提供思路提示,更给我们提供代码框架,我们需要做的就是往框架里面填写代码并添加一些自己的思考,这极大程度地提高了我们编写代码的效率,同时也拓宽了我们编写代码的思路。跟随AI刷题的步伐,我们的写代码的能力也会越来越强。豆包MarsCode AI刷题工具通过精选真题与个性化推荐功能,帮助我高效地掌握了复杂的算法知识,也提升了我的自学能力,是我学习过程中的得力助手。