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

查询给定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()

优化细节说明

  1. 一次性读取输入:用sys.stdin.read()把所有输入内容一次性读入,再分割成字符串列表处理,比循环调用input()快数倍,彻底解决输入超时问题。
  2. 省略不必要的列表存储:直接统计每个数字的出现次数到cnt数组,节省内存同时减少一次循环操作。
  3. 固定MAX值:根据题目约束直接设置MAX=10**5,避免动态计算最大值的额外开销,同时适配所有合法输入。
  4. 批量输出结果:把所有查询结果先存入列表,最后用'\n'.join()一次性输出,减少多次print()带来的IO开销。
  5. 移除全局变量:用主函数封装逻辑,避免全局变量的潜在问题,代码结构更清晰。

内容的提问来源于stack exchange,提问作者AMIT Kumar

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.06 20:22:45