Online Compiler C

#include <stdio.h> int find_missing(int n, int a[]) { int M = a[0], N = a[0]; for (int i = 0; i < n; i++) { if (a[i] < M) { M = a[i]; } if (a[i] > N) { N = a[i]; } } int num = N - M + 1; int count[num] = {0}; for (int digit = M; digit <= N; digit++) { for (int i = 0; i < n; i++) { if (a[i] == digit) { count[digit - N] = 1; } } } for (int i = 0; i < num; i++) { if (count[i] == 0) { return i + M; } } } int main() { return 0; }
这段代码试图在一个整数数组中找出缺失的数字。它先找出数组的最小值M和最大值N,然后创建一个大小为N-M+1的计数数组,最后遍历范围[M,N]找出哪个数字没出现过。

代码中存在一个关键错误:

- 在标记数字出现时,`count[digit - N]` 这个索引计算有问题。当digit等于M时,digit-N是负数,会导致数组越界。正确的索引应该是 `digit - M`,这样才能将数字映射到从0开始的计数数组位置。

另外,函数没有处理所有数字都出现的情况,如果数组是完整的连续序列,循环结束后没有返回值,这会导致未定义行为。