在一次采访中,他们要求我从数组中找出丢失的数字。
array
的编号从1
到N
。
我的方法:
int main()
{
int ar[20];
int sum = 0;
int n;
printf("enter numb of elements\n");
scanf("%d", &n);
printf("enter array numbers\n");
for(int i = 0; i<n;i++){
scanf("%d", &ar[i]);
sum +=ar[i];
}
printf("missing num=%d", ((n*(n+1))/2)-sum);
}
但是面试官在第一轮面试后没有回电。 我不知道我的方法有什么问题。
答案 0 :(得分:4)
您的代码存在一些问题:
该算法是错误的(偏移一):如果数组包含从1到N的所有数字(除了一个缺失的数字),则它具有N-1个元素。您的代码读取N个元素。 (或者,如果数组实际上有N个元素,则目标总和为(N + 1) * (N + 2) / 2
(从1到N + 1的数字之和,而不是N * (N + 1) / 2
。)
包含项丢失(尤其是#include <stdio.h>
)。这意味着对printf
/ scanf
的调用具有未定义的行为。
int main()
应该是int main(void)
。
scanf
调用中没有一个检查其返回值。这意味着当读取输入失败并产生垃圾输出时,您的代码无法实现。
如果n
大于20,则您的代码将静默写入ar
的边界之外。这是经典的缓冲区溢出。
前一点特别不幸,因为您的代码甚至不需要数组。您对输入数字所做的全部工作就是将它们加到sum
中,而无需单独的数组。
您的格式在for(int i = 0; i<n;i++){
中不一致。为什么for(int
和i<n;i++){
中没有空格,但是i = 0;
周围却有空格?
根据N
的大小,n*(n+1)
可能会溢出。
您的代码生成的输出的最后一行缺少其终止换行符:printf("missing num=%d\n", ...);