女孩和机器人一起思考

一起动脑筋 · 先看一个小故事

机器人通过了题目给的两个样例,遇到相同分数时却失败了。样例像几扇窗,不是整栋房子。

把过程摊开来看

沿着编号看一遍,再用自己的话讲一遍
  1. 样例通过验证部分情况
  2. 补最小输入检查边界
  3. 补重复与极值检查假设
  4. 最大规模检查效率

通过样例说明这些输入下结果正确,不代表所有合法输入都正确。

还要分析算法是否完整覆盖题意,以及类型范围、边界和复杂度是否合适。

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,漏掉了哪类重要例子?

想好了吗?点开看解释

逆序、重复值、单元素等。已经有序的数据可能掩盖比较或交换错误。