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

Python重复字符串计数遇内存报错,求解排行榜最优解法原理

理解Repeated String挑战的高效解法

嘿,作为Python新手,你遇到的这个内存问题其实是竞技编程里很常见的「暴力解法扛不住大数据量」的典型情况,我来一步步帮你拆解那个正确解法的逻辑,顺便说说你原来代码的问题所在~

先说说你原来的代码为啥会内存报错

你的代码里用了(s*n)[:n],这相当于把字符串s重复n次,再取前n个字符。但如果n是HackerRank里常见的超大数值(比如10^18量级),生成这么长的字符串会直接占满内存——32位平台的内存限制本来就小,自然会抛出Memory Error。这种思路只适合小输入,完全扛不住大数据量。

正确解法的逻辑拆解

我们先把正确代码再贴一遍,然后逐行解释:

def repeatedString(s, n):
    L = len(s)
    return (s.count('a') * (n//L) + s[:n % L].count('a'))
  1. 获取原字符串长度L:L = len(s),这一步先拿到我们要重复的基础字符串的长度。
  2. 计算完整重复部分的'a'数量:
    • s.count('a'):先算出单个s里包含多少个字符'a'。
    • n//L:这是整数除法,算出n个字符里能完整放下多少个s。比如s长度是3,n是10,那就能完整放3次(3*3=9个字符)。
    • 把这两个数相乘,就是所有完整重复的s里包含的'a'总数。
  3. 计算剩余部分的'a'数量:
    • n % L:这是n除以L的余数,也就是完整重复之后还剩下多少个字符需要从s的开头取。比如上面的例子,10%3=1,就是还要取s的前1个字符。
    • s[:n % L].count('a'):取s的前n%L个字符,统计里面的'a'数量。
  4. 总和就是最终结果:把完整重复部分的'a'数量和剩余部分的'a'数量加起来,就是我们要的答案。

举个例子更直观

假设s = 'abcac',n = 7:

  • L = 5,s.count('a') = 2(字符串里第0位和第3位是'a')
  • n//L = 7//5 = 1,完整重复1次,贡献2*1=2个'a'
  • n%L = 7%5 = 2,取s[:2] = 'ab',里面有1个'a'
  • 总数量是2+1=3,对应实际字符串abcacab里的'a'数量,完全正确!

这种解法的核心优势在于完全不需要生成超长字符串,不管n多大,我们只操作原字符串和它的一小部分,内存占用始终是原字符串的长度,完美解决了内存溢出的问题——这也是竞技编程处理大数据量的关键思路:找数学规律,避免暴力生成数据。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 08:00:14