找到1到100之间的缺失数字

时间:2012-03-09 10:14:34

标签: c

此问题已在此处提出,之前使用以下代码

find3missing(int* array)
{ 
    int newarray[100] = {0};
    For i = 0 to 99  
        ++newarray[array[i]] ;
    For i = 0 to 99 
        If newarray[i] != 1
            Cout << “the missing number is ” << i+1 << endl ;
} 

但是当我检查这段代码时,它似乎不起作用。假设我有一个{1,2,6}的数组。输出应该是3,4,5但是使用上面的代码我得到1,4,5,6。下面是我对数组大小为6的伪代码的实现。

main()
{
    int a[6]={1,2,6};
    int tmp[6]={0},i;
    for(i=0;i<6;i++)
    {
        ++tmp[a[i]];
    }
    for(i=0;i<6;i++)
    {
        if(tmp[i]!=1)
        {
            printf("%d",i+1);
        }
    }
}

这是正确的代码吗?

3 个答案:

答案 0 :(得分:2)

++newarray[array[i]]应为++newarray[array[i] - 1]。这是因为您对1-100个数字序列感兴趣,因此没有0,但C数组基于0。如果您在此处查看coutthe missing number is ” << i+1,则可以通过添加1来“取消”该数字。

还有一个问题:你应该传递array的元素数量,例如:

find3missing(int* array, int length) { 
  int newarray[100] = {0};

  for (int i = 0; i < length; i++) {
      ++newarray[array[i] - 1] ;
  }

答案 1 :(得分:1)

C / C ++数组基于零,因为A[i]等同于*(A+i)。因此,将++newarray[array[i]]更改为++newarray[array[i]-1]。还可以使用mallocfreememset来使用动态大小的数组。

#include <stdlib.h>
#include <stdio.h>
#include <string.h>

void find3missing(int* pArray, size_t size, int min, int max){
    int* newarray;
    int i;
    unsigned int j;
    int range = max - min;
    if(range < 0)
        return;
    newarray = (int*) malloc(range*sizeof(int)); // allocate enough memory
    memset(newarray,0,range*sizeof(int));        // set that block to zero
    for(j = 0; j < size; ++j){
        ++newarray[pArray[j]-min];
    }
    for(i = 0; i < range; ++i){
        if(!newarray[i])
            printf("%d is missing!\n",min+i);
    }
    free(newarray);
}

int main(){
    int test[] = {1,3,6};
    find3missing(test,sizeof(test)/sizeof(int),1,6);
    return 0;
}

请注意,如果对数组进行排序,此解决方案的效率非常低。在这种情况下,请查看Jimmy Gustafsson's answer

答案 2 :(得分:1)

这个算法非常简单,因为你使用的是排序数组。只需检查当前值+1是否等于下面的下一个值:

find3missing(){ 
  int array[arraySize]; // the array with integers

  for(i=0;i<arraySize;i++)
     if(array[i]+1 != array[i+1])  // if value array[i]+1 is not equal the next index 
                                   // value, then it's a missing number 
        printf("A missing number: %i", i+1); 
  }