查询给定N个数中K的倍数个数的算法问题及代码调试求助
问题分析与解决方案
你的代码在包含78000条输入的测试用例中执行失败,核心原因是大规模场景下的IO效率过低,同时还有一些可以优化的细节来适配题目1e5级别的约束。
问题点拆解
- 输入读取速度太慢:Python的
input()函数在循环调用1e5次时,IO开销会非常大,直接导致程序超时。 - 不必要的内存占用:你把所有输入数字都存储到列表
a中,但实际上不需要保存这些数字,直接统计计数数组即可。 - 动态MAX值的潜在风险:虽然动态取数组最大值逻辑没问题,但题目已经明确数字≤1e5,固定MAX值会更稳妥,也能避免极端情况的额外开销。
优化后的代码
import sys def main(): MAX = 10**5 cnt = [0] * (MAX + 1) # 一次性读取所有输入,大幅提升IO效率 data = sys.stdin.read().split() ptr = 0 n = int(data[ptr]) ptr += 1 # 直接统计数字出现次数,无需存储所有数字 for _ in range(n): num = int(data[ptr]) cnt[num] += 1 ptr += 1 # 预处理每个K对应的倍数总数 ans = [0] * (MAX + 1) for i in range(1, MAX + 1): for j in range(i, MAX + 1, i): ans[i] += cnt[j] q = int(data[ptr]) ptr += 1 output = [] # 批量收集结果,减少输出IO次数 for _ in range(q): k = int(data[ptr]) output.append(str(ans[k])) ptr += 1 print('\n'.join(output)) if __name__ == "__main__": main()
优化细节说明
- 一次性读取输入:用
sys.stdin.read()把所有输入内容一次性读入,再分割成字符串列表处理,比循环调用input()快数倍,彻底解决输入超时问题。 - 省略不必要的列表存储:直接统计每个数字的出现次数到
cnt数组,节省内存同时减少一次循环操作。 - 固定MAX值:根据题目约束直接设置
MAX=10**5,避免动态计算最大值的额外开销,同时适配所有合法输入。 - 批量输出结果:把所有查询结果先存入列表,最后用
'\n'.join()一次性输出,减少多次print()带来的IO开销。 - 移除全局变量:用主函数封装逻辑,避免全局变量的潜在问题,代码结构更清晰。
内容的提问来源于stack exchange,提问作者AMIT Kumar
相关产品推荐
相关产品推荐

