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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.01 03:24:29