如何解决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




