You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何解决Python中的NZEC运行时错误?CodeChef TREE2代码报错咨询

解决Python中的NZEC运行时错误(以CodeChef TREE2问题为例)

嘿,我来帮你搞定这个NZEC的问题!先给你捋清楚前因后果:

什么是NZEC?

NZEC是Non Zero Exit Code的缩写,说白了就是你的程序没有正常结束(正常结束应该返回0),而是因为某种异常崩溃退出了,所以判题系统给了你这个错误。

你的代码为什么在CodeChef上触发NZEC?

先看你的代码:

for _ in range(int(input())):
    n=int(input())
    l=set(map(int,input().strip().split()))
    print(len(l))

问题出在n=0的测试用例上!根据TREE2的题目要求,n的取值范围是0 ≤ n ≤ 1e5。当n=0时,这一组测试用例是没有第二行输入的,但你的代码还是会执行input()去读取一行,这时候就会触发EOFError(因为已经没有输入可读了),直接导致程序崩溃,抛出NZEC错误。

另外还有一种小概率情况:当输入量极大的时候,input()函数在处理时可能会出现缓冲问题,但最常见的还是n=0的场景导致的错误。

怎么修复这个问题?

只需要加一个简单的判断,当n>0的时候再读取那一行输入,n=0的时候直接输出0就行。这里给你两种修复方案:

方案1:贴近原代码风格

for _ in range(int(input())):
    n = int(input())
    if n == 0:
        print(0)
        continue
    l = set(map(int, input().strip().split()))
    print(len(l))

方案2:更适合大输入的稳定写法

如果测试用例的输入量很大,用sys.stdin一次性读取所有输入再处理会更稳定,避免逐行读取的缓冲问题:

import sys

# 一次性读取所有输入并按空格分割
input_data = sys.stdin.read().split()
ptr = 0
T = int(input_data[ptr])
ptr += 1

for _ in range(T):
    n = int(input_data[ptr])
    ptr += 1
    if n == 0:
        print(0)
        continue
    # 直接截取对应数量的元素
    num_set = set(map(int, input_data[ptr:ptr+n]))
    ptr += n
    print(len(num_set))

这段代码在HackerRank上能正常运行吗?

大概率是可以的!原因可能有两个:

  • HackerRank的测试用例里可能没有包含n=0的情况;
  • 就算有n=0的测试用例,HackerRank可能会为n=0的情况提供一个空行,这样你的input()能读到空字符串,转成set之后长度是0,不会触发错误。

不过如果HackerRank的测试用例严格按照题目要求(n=0时无第二行),那你的代码同样会触发错误,只是大概率它的测试用例没这么严格而已。

内容的提问来源于stack exchange,提问作者Shashwata Saha

火山引擎 最新活动