从1..N中找到缺失的数字

时间:2019-06-03 13:02:12

标签: c

在一次采访中,他们要求我从数组中找出丢失的数字。 array的编号从1N

我的方法:

   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);
   }

但是面试官在第一轮面试后没有回电。 我不知道我的方法有什么问题。

1 个答案:

答案 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(inti<n;i++){中没有空格,但是i = 0;周围却有空格?

  • 根据N的大小,n*(n+1)可能会溢出。

  • 您的代码生成的输出的最后一行缺少其终止换行符:printf("missing num=%d\n", ...);