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

