在线编译器 C

#include <stdio.h> int find_missing(int n, int a[]) { int min = 0; min = a[0]; for (int i = 0; i < n; i++) { if (a[i] < min) { min = a[i]; } } int max = a[0]; for (int i = 0; i < n; i++) { if (a[i] > max) { max = a[i]; } } int num = 0; for (int q = min; q <= max; q++) { num = 0; for (int i = 0; i < n; i++) { if (a[i] == q) { num=1; } } if (num == 0) { return q; } }return 0; } int main() { int a[5] = {1, 2, 3, 5, 6}; printf("%d", find_missing(5,a)); return 0; }
这段代码的功能是:在一个包含连续整数(但缺少一个数)的数组中,找出缺失的那个整数。它先找到数组中的最小值和最大值,然后在这个范围内逐个检查哪个数没有出现在数组中,最后返回第一个缺失的数。

- 你的代码在找最小值时,`min` 初始化为 0,但数组元素可能都是正数,这样 `min` 永远不会被更新。应该把 `min` 初始化为数组的第一个元素,就像你后面做的那样,但当前写法中 `min = a[0]` 在 `int min = 0;` 之后,实际上覆盖了初始值,所以这里没有错误。但更简洁的做法是直接 `int min = a[0];` 并去掉前面的赋值。

- 你的嵌套循环效率较低,但逻辑是正确的。注意:如果数组中的数字不是从最小值到最大值连续缺失一个,而是有多个缺失,你的函数只会返回第一个缺失的数。另外,如果数组本身没有缺失(即所有数连续),函数会返回 0,但 0 可能是一个有效的缺失值吗?考虑一下当数组元素都是正数时,返回 0 是否合理。