Golang操作超长字符串如何避免out of memory内存溢出问题
问题根源
你写的代码触发OOM是必然结果:题目里n上限是10^12,真按strings.Repeat生成等长字符串,按每个英文字符占1字节算,要吃掉近1TB内存,普通消费级机器甚至服务器根本扛不住。
核心问题是你把「逻辑上无限重复的虚拟字符串」真的在内存里实例化了——这类超大规模序列计算,根本不需要把整个序列造出来,找对规律做计算就行,完全不占多余内存。
解题思路
整个字符串是s的无限重复,计数'a'完全可以拆成三部分计算,全程只需要操作原始长度不超过100的s:
- 先统计单个原始字符串s中'a'的总个数,记为
singleCount - 计算前n个字符里包含多少个完整的s:
fullTimes = n / len(s),这部分的'a'总数就是fullTimes * singleCount - 计算拼完所有完整s后剩下的字符长度:
remainLen = n % len(s),只需要统计s前remainLen个字符里的'a'个数,和前面的完整部分结果相加,就是最终答案。
Go实现代码
注意n的量级到1e12,必须用int64类型存储长度相关变量,避免整数溢出:
package main import ( "fmt" "strings" ) func main() { var s string var n int64 _, _ = fmt.Scan(&s, &n) sLen := int64(len(s)) singleA := int64(strings.Count(s, "a")) fullPartA := (n / sLen) * singleA remainA := int64(strings.Count(s[:n%sLen], "a")) fmt.Println(fullPartA + remainA) }
这段代码的内存占用只和原始字符串s的长度有关,和n的大小完全无关,哪怕n取到10^18也不会出现内存问题。
通用处理原则:面对逻辑上超长、存在固定重复规律的序列时,永远优先找数学规律做分段计算,不要尝试在内存中构造完整序列。
内容的提问来源于stack exchange,提问作者Ben
相关产品推荐
相关产品推荐

