C 查找未排序整数数组中缺失元素的计数

C 查找未排序整数数组中缺失元素的计数,c,arrays,algorithm,performance,C,Arrays,Algorithm,Performance,如果有些数字是重复的,我怎么才能从C中的整数数组中找到缺少多少元素呢 假设数组是intarray={1,2,1,5,4},并且应该有多达6的数字。然后,程序/函数应输出/返回2,因为缺少2个元素(3,6) 注意:0不算作丢失的数字,也不能出现在数组中。这样做吗 int countMissing(int *x, int arrLen, int bound) { int * y = malloc ((bound + 1) * sizeof(int)); int i = 0; int m

如果有些数字是重复的,我怎么才能从C中的整数数组中找到缺少多少元素呢

假设数组是
intarray={1,2,1,5,4}
,并且应该有多达
6的数字。然后,程序/函数应输出/返回
2
,因为缺少2个元素(
3,6

注意:0不算作丢失的数字,也不能出现在数组中。

这样做吗

int countMissing(int *x, int arrLen, int bound)
{
  int * y = malloc ((bound + 1) * sizeof(int));
  int i  = 0;
  int missing = 0;
  memset(y,0,sizeof(int)*(bound+1));


  for(i = 0; i<arrLen; i++)
  {
    if(x[i]<=bound)
    {
      y[x[i]] = 1;
    }else
    {
       // error handling e.g.
       return -1;
    }

  }

  for(i = 1; i<=bound; i++)
  {
    if(y[i]==0) missing++;
  }

  free(y);
  return missing;
}

输出:6。

你是说长度为
n
的数组可以有介于
1
n+1
之间的数字吗?@YoungHobbit不,数组元素可能是相同的,但例如,可能缺少最多10个数字。因此,将有6个元素缺失。序列的最大数目(问题中的6个)可以是任何数字。(但它显然是预先指定的)Nits:(1)您应该分配
char*y
以节省一些空间;(2) 您应该使用
y[x[i]-1]
或分配一个大小为
bound+1
的数组,因为否则您有一个越界访问;(3) 你应该释放你的数组。@nneonneo:fixing,我没有带调试器;现在应该可以用了为什么你用
memset()
而不是
calloc()
?@Mitsos101:这是一种风格thing@Giorgi不过,内存是否需要归零?
int main(void) 
{
   int array [] = {1, 2, 1, 5, 4};
   printf("%d", countMissing(array, 5, 10));
   return 0;
}