You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Minion Game代码优化求助:解决单测试用例超时问题

The Minion Game 代码超时问题优化求助

问题背景

Kevin 和 Stuart 玩 The Minion Game,规则如下:

  • 两人获得相同字符串
  • 需用字符串中的字母生成子字符串
  • Stuart 生成以辅音开头的子字符串,Kevin 生成以元音开头的子字符串
  • 生成所有可能子字符串后游戏结束

现有代码可通过大部分测试用例,但存在一个测试用例超时,需要优化:

def minion_game(string):
    # your code goes here
    n = len(string)
    comb = ((n)*(n+1))/2
    count_k = 0
    count_s = 0
    count_k = sum([len(string[i:]) for i in range(len(string)) if string[i] in "AEIOU"])
    count_s = comb - count_k
    
    if count_s == count_k:
        print("Draw")
    elif count_s > count_k:
        print("Stuart", int(count_s) )
    else:
        print("Kevin", int(count_k))

优化方案及解释

原代码的主要性能瓶颈在于:

  1. 列表推导式会一次性生成所有符合条件的元素列表,对于超长字符串会占用大量内存,拖慢计算速度
  2. 用字符串"AEIOU"做成员判断,时间复杂度为O(5),不如集合的O(1)高效
  3. 重复调用len(string),以及浮点数运算后再转整数,带来额外开销

优化后的代码如下:

def minion_game(string):
    vowels = {'A', 'E', 'I', 'O', 'U'}
    n = len(string)
    total_substrings = n * (n + 1) // 2
    kevin_score = sum(n - i for i, char in enumerate(string) if char in vowels)
    stuart_score = total_substrings - kevin_score
    
    if stuart_score == kevin_score:
        print("Draw")
    elif stuart_score > kevin_score:
        print("Stuart", stuart_score)
    else:
        print("Kevin", kevin_score)

关键优化点:

  • 生成器表达式替代列表推导式:sum(n - i for ...)是生成器表达式,惰性求值,不会一次性生成所有元素,大幅减少内存占用,尤其适合超长字符串
  • 集合存储元音:vowels用集合存储,成员判断速度远快于字符串
  • 整数运算替代浮点数:用//整数除法计算总子串数,避免后续转整数的操作
  • 减少重复计算:提前存储字符串长度n,直接用n - i代替len(string[i:]),避免重复计算子串长度

这些优化能显著降低代码的时间和空间复杂度,解决超时问题。

内容的提问来源于stack exchange,提问作者Jimmy

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.09 00:10:19