
一起动脑筋 · 先看一个小故事
机器人通过了题目给的两个样例,遇到相同分数时却失败了。样例像几扇窗,不是整栋房子。
把过程摊开来看
- 样例通过验证部分情况
- 补最小输入检查边界
- 补重复与极值检查假设
- 最大规模检查效率
通过样例说明这些输入下结果正确,不代表所有合法输入都正确。
还要分析算法是否完整覆盖题意,以及类型范围、边界和复杂度是否合适。
01样例到底是什么?
样例是题目作者提供的少量输入输出,用来帮助理解题意和检查基本实现。
它不是全部测试数据。
02为什么样例很容易“骗过”错误程序?
因为错误可能只在某些特殊输入下出现。
例如最大值程序把初值写成 0:
int maximum = 0;
正数样例能过,但全负数输入就会错。
03常见原因一:漏边界
- n=1
- 全部相等
- 目标不存在
- 最后一个位置
- 空集合(若允许)
04常见原因二:数据范围没处理好
逻辑正确,也可能因为 int 溢出而 WA。
long long sum = 0;
是否需要更宽类型,要根据最大可能结果估算。
05常见原因三:算法太慢
小样例只有 10 个数据,O(n²) 很快;正式测试可能有 200000 个数据,就可能 TLE。
06常见原因四:输出格式不对
多输出调试文字、少一个空格通常未必有问题(取决于评测),但题目要求的行数、内容和顺序必须严格符合规格。
07怎样自己构造反例?
最小
n=1
最大
接近范围上限
极端顺序
递增 / 递减
特殊值
0、负数、重复值
你已经知道了什么
- 样例通过不能证明程序完全正确。
- 隐藏测试会覆盖更多合法输入。
- 边界、溢出、复杂度和输出格式都可能导致失败。
- 应主动构造反例,而不是只依赖官方样例。
- 程序正确性来自对所有合法输入的逻辑保证。
下一篇:怎样自己找到程序里的 Bug?
轮到你来试一试
排序只测 1、2、3,漏掉了哪类重要例子?
想好了吗?点开看解释
逆序、重复值、单元素等。已经有序的数据可能掩盖比较或交换错误。