Python处理超大整数时触发OverflowError溢出错误的问题咨询
问题根因
报错核心不是Python大整数运算能力不足,是原有实现逻辑的思路错误:代码试图构造一个长度与n(测试用例中为10^12量级)完全相等的实体字符串,再做切片、转列表遍历计数。
- 当n达到万亿级别时,
s*(int(n/len(s))+1)会尝试申请存储万亿级字符的连续内存,本身就不具备可行性 - Python字符串乘法、切片操作处理的长度参数超过平台索引位长上限(32/64位平台的索引可表示范围远小于1e12)时,就会抛出
OverflowError: cannot fit 'int' into an index-sized integer错误 - 即使绕过溢出报错,构造超长字符串带来的内存开销、遍历耗时也会直接超出OJ的时间、内存限制,无法通过测试。
修复思路
这道题是典型的计数类算法题,完全不需要模拟字符串的实际重复拼接过程,通过数学拆分计算就可以在O(len(s))时间复杂度、O(1)额外空间复杂度下得到结果,从根源上规避大长度字符串构造带来的所有问题:
- 先统计单个原始字符串
s中字符a的出现次数 - 计算长度为n的范围内,完整包含多少个原始字符串,这部分的
a总数可以直接用「完整重复次数 × 单个字符串的a计数」算出 - 计算最后不足一个完整字符串的余数长度,统计原始字符串前余数位中
a的出现次数,和上一步的结果相加就是最终答案。
可直接通过测试的实现代码
def repeatedString(s, n): s_length = len(s) # 统计单个原字符串内a的数量 a_in_single = s.count('a') # 计算完整重复段的a总数 full_part = (n // s_length) * a_in_single # 计算末尾剩余截断段的a总数 remain_part = s[:n % s_length].count('a') return full_part + remain_part if __name__ == '__main__': s = input() n = int(input().strip()) res = repeatedString(s, n) print(res)
该实现的运行耗时仅和输入字符串s的长度有关,和n的大小完全无关,哪怕n取值到1e18也不会触发溢出、内存不足或超时问题。针对给出的测试用例
s='a', n=1000000000000,代码会直接返回正确结果1000000000000,全程不会构造任何超长字符串。
内容的提问来源于stack exchange,提问作者Jayan Paliwal
相关产品推荐
相关产品推荐

