一、常见算法题提交报错类型及原因
1. 答案错误(Wrong Answer,WA)
- 原因:提交的代码输出与正确结果不一致,算法存在错误。
- 常见错误场景示例:题目要求输出两数之和,代码却输出两数之差;数据类型使用错误(如需要 long long 却用 int 、需要 double 却用 float );局部数组未初始化;浮点数比较误用 == ;字符串末尾忘记 \0 ;多组数据测试忘记 while 循环; && 和 || 搞混淆;位运算和逻辑运算搞混淆;取模结果负数忘记变正数;贪心策略错误;二分查找边界错误;动态规划状态转移方程错误等。
2. 超时(Time Limit Exceeded,TLE)
- 原因:算法效率太低,程序运行时间超过限制(如服务器希望1秒出结果,代码却运行了2秒)。
- 常见错误场景示例:题目要求输出两数之积,代码却用循环暴力计算;动态规划、搜索、二分查找、双指针、滑动窗口等题目暴力求解;需要用哈希表、线段树优化的题目暴力求解;暴力做大数据量字符串匹配问题;双广的题用单广求解;动态规划用搜索暴搜;贪心的题用搜索枚举所有情况;区间DP忘记做降维;记忆化搜索采用递归(大数据情况); cin 忘记关闭同步;字典树的题暴力去做匹配等。
3. 超内存(Memory Limit Exceeded,MLE)
- 原因:算法太耗内存,申请的内存超过限制(如题目要求申请30M内存,代码却申请了60M)。
- 常见错误场景示例:题目只需输出两数之和,代码却申请了超大数组;超大数组静态分配;动态内存过度申请;容器无限制存数据;递归栈帧堆积超限;重复创建大对象副本;内存泄漏持续堆积;多容器冗余存数据等。
4. 编译错误(Compilation Error,CE)
- 原因:代码编译未通过,可能因本地编译器与服务端编译器差异导致(本地的Warning在服务端可能是Error)。
- 常见错误场景示例:头文件缺失;类型转换错误;返回类型不匹配;未初始化变量使用;字符串常量赋值错;重复包含头文件;结构体未定义使用;参数数量不匹配;关键字作变量名;未声明变量使用;参数类型不匹配;括号不匹配;重复定义变量;未定义函数使用;数组下标超范围;指针类型不兼容;语句末尾缺分号;试图修改常量等。
5. 运行错误(Runtime Error,RE)
- 原因:代码编译通过,但执行过程中产生异常(如数组越界、空指针访问、除零操作等),有些OJ称为段错误(Segment Fault)。
- 常见错误场景示例:题目要求输出两数之和,代码却执行了除0操作;空指针访问;野指针解引用;堆内存重复释放;释放空指针;内存分配失败;除零操作;数组长度为零访问;递归深度超限;非法内存地址访问;类型转换越界;文件打开失败读写;枚举值越界使用;虚函数空对象调用;动态数组越界赋值;指针类型不匹配访问;栈溢出;堆溢出等。
二、解决思路
- 对于WA,需检查算法逻辑和代码细节,确保输出与正确结果一致。
- 对于TLE,需优化算法效率,如采用更高效的算法、剪枝、数据结构优化等,必要时用空间换时间。
- 对于MLE,需优化内存使用,如减少不必要的内存申请、复用内存、采用时间换空间的策略等。
- 对于CE,需仔细检查代码语法、头文件、变量定义等,确保与服务端编译器兼容。
- 对于RE,需检查代码中可能导致运行时异常的操作,如数组访问、指针使用、数学运算等。