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

编程新手求助:Python代码在URI评测系统超时问题

解决URI评测系统代码超时问题的优化方案

嘿,作为编程新手遇到超时问题太正常了,我来帮你拆解下问题根源,再给你几个高效的优化方案!

原代码的瓶颈分析

你的代码功能完全没问题,但效率拖了后腿,才导致超时。核心问题出在这一行:

if coords.count(coords[i])>1:

每次调用coords.count()都会完整遍历一遍整个列表去统计当前元素的出现次数。假设你有n个坐标,这个操作的时间复杂度是O(n),再加上外层遍历整个列表的循环,整体时间复杂度就变成了O(n²)。当输入数据量稍大(比如几千甚至上万条坐标)时,这种高复杂度的代码很容易触发URI的时间限制。

优化思路:用集合降低时间复杂度

我们可以利用Python的集合(set)来彻底解决效率问题。集合的成员检查(in操作)是基于哈希表实现的,平均时间复杂度是O(1)——简单说就是查一次几乎不花时间。我们只需要遍历一次输入,同时记录已经见过的坐标,一旦发现重复就直接标记,甚至可以提前终止循环,整体时间复杂度降到O(n),效率会提升好几倍。

优化后的代码

版本1:边读边检查(节省内存)

这个版本不需要先把所有坐标存到列表里,读到一个就检查一个,发现重复可以直接跳出循环,还能节省内存:

cont = 0
cont_register = int(input())
seen_coords = set()

for _ in range(cont_register):
    coord = input()
    if coord in seen_coords:
        cont = 1
        break  # 发现重复后无需继续处理剩余输入
    seen_coords.add(coord)

print(cont)

版本2:快速读取大量输入(应对超大数据量)

如果输入的坐标数量特别多,input()函数的速度可能不够快,这时可以用sys.stdin一次性读取所有输入再处理,速度会更快:

import sys

cont = 0
all_lines = sys.stdin.read().splitlines()
cont_register = int(all_lines[0])
seen_coords = set()

for line in all_lines[1:cont_register + 1]:
    if line in seen_coords:
        cont = 1
        break
    seen_coords.add(line)

print(cont)

额外小提示

原代码里的else: cont=cont是完全多余的,可以直接删掉,不过这不是导致超时的核心原因啦。

内容的提问来源于stack exchange,提问作者Lucas Motta

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 04:11:10