豆包MarsCode 刷题(五) | 豆包MarsCode AI刷题

165 阅读3分钟

本博客含有两道题目:游戏英雄升级潜力评估;卡牌翻面求和问题

游戏英雄升级潜力评估

问题描述

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

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

我的思路

本题的规则是存在比自己等级低的才可以升级,也就是说除了等级最低的英雄无法升级,其余英雄均可以升级。因此可以统计最低等级英雄的数量,并用总数减去这个数量。

豆包思路

  • 找到最小等级:使用 min(u)
  • 移除最小等级的英雄:使用列表推导式 [level for level in u if level != min_level] 来移除所有等级等于最小等级的英雄。
  • 计算剩余英雄数:使用 len(u) 来计算剩余的英雄数。

融合思路并编程

我的思路与豆包思路大致相同,不同之处是我会使用sorted先进行排序,然后在统计最小等级的次数,而不是使用列表推导式进行计算。这样可以减少比较次数,算法更加优良。

def solution(n: int, u: list) -> int:
    # write code here
    minNum=min(u)
    num=0
    u=sorted(u)
    for i in range(n):
        if minNum==u[i]:
            num+=1
        else:break
    return n-num
​
# 豆包代码
def solution(n: int, u: list) -> int:
    # 找到最小等级
    min_level = min(u)
    
    # 移除所有等级等于最小等级的英雄
    # 提示:使用列表推导式或循环来移除元素
    u = [level for level in u if level != min_level]
    
    # 返回剩余英雄数
    return len(u)

卡牌翻面求和问题

问题描述

小M有 nn 张卡牌,每张卡牌的正反面分别写着不同的数字,正面是 aia**i,背面是 bib**i。小M希望通过选择每张卡牌的一面,使得所有向上的数字之和可以被3整除。你需要告诉小M,一共有多少种不同的方案可以满足这个条件。由于可能的方案数量过大,结果需要对 109+7109+7 取模。

例如:如果有3张卡牌,正反面数字分别为 (1,2)(2,3)(3,2),你需要找到所有满足这3张卡牌正面或背面朝上的数字之和可以被3整除的组合数。

我的思路

我最初的想法就是遍历所有情况,然后返回最终结果。

豆包思路

  1. 初始化 dp 数组dp = [1, 0, 0] 表示初始状态下,和为0的组合数为1,和为1和2的组合数为0。
  2. 更新 dp 数组:对于每一张卡牌,我们创建一个新的 new_dp 数组,并根据当前卡牌的正面和背面数字更新 new_dp
  3. 返回结果:最终,dp[0] 就是所有卡牌的正面或背面朝上的数字之和可以被3整除的组合数。

融合思路并编程

豆包使用动态规划来解决这个问题,并且使用一个数组dp 来记录当前所有可能的和模3的结果,比我的方法更加简洁,所以采用豆包的思路进行解决。

def solution(n: int, a: list, b: list) -> int:
    MOD = 10**9 + 7
    dp = [1, 0, 0]
    
    for i in range(n):
        new_dp = [0, 0, 0]
        for j in range(3):
            new_dp[(j + a[i]) % 3] = (new_dp[(j + a[i]) % 3] + dp[j]) % MOD
            new_dp[(j + b[i]) % 3] = (new_dp[(j + b[i]) % 3] + dp[j]) % MOD
        dp = new_dp
    
    return dp[0]