此问题已在此处提出,之前使用以下代码
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);
}
}
}
这是正确的代码吗?
答案 0 :(得分:2)
此++newarray[array[i]]
应为++newarray[array[i] - 1]
。这是因为您对1-100个数字序列感兴趣,因此没有0,但C数组基于0。如果您在此处查看cout
:the 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]
。还可以使用malloc
,free
和memset
来使用动态大小的数组。
#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);
}