非常简单的问题 寻求高手方案
比如:有数组(或者 整数序列) int s[]={1,3,2,4,7};
求在序列1-8中 有哪个数字被遗漏了
我的输出是 :
被遗漏的数据有 5
被遗漏的数据有 6
被遗漏的数据有 8
但是我的代码却是用的比较暴力的枚举办法 很是想知道其他方案
2014-06-05 10:42
程序代码:#include <stdio.h>
#include <malloc.h>
void foo_bitmark( int a, int b, const int s[], size_t n )
{
unsigned* mark = calloc( ((b+1-a)+sizeof(unsigned)-1)/sizeof(unsigned), sizeof(unsigned) );
for( size_t i=0; i!=n; ++i )
mark[ (s[i]-a)/sizeof(unsigned) ] |= 1u << ( (s[i]-a)%sizeof(unsigned) );
for( size_t i=a; i!=b+1; ++i )
if( !(mark[(i-a)/sizeof(unsigned)] & (1u<<((i-a)%sizeof(unsigned)))) )
printf( " %d", i );
printf( "\n" );
free( mark );
}
int main()
{
int s[] = { 1,3,2,4,7 };
foo_bitmark( 1, 8, s, sizeof(s)/sizeof(s[0]) );
return 0;
}就是用 bit数组 记录已有的数字。
2014-06-05 12:27
太高深了,看不懂,我觉得最简单的就是下面的搞法
2014-06-05 12:50
程序代码:#include<stdio.h>
void cr(int beg,int end,int s[],int slen)
{
int i,j;
bool flag=false;
for(i=beg;i<=end;i++)
{
for(j=0;j<slen;j++)
{
if(i==s[j])
{
flag=true;
break;
}
}
if(flag==false) printf("被遗漏的数据有 %4d \n",i);
flag=false;
}
printf("\n");
}
int main()
{
int s[]={1,3,2,4,7};
cr(1,8,s,5);
return 0;
}

2014-06-05 14:48
2014-06-05 15:08
2014-06-05 16:14
2014-06-05 17:09
程序代码:#include<stdio.h>
#include <stdlib.h>
void cr(int beg,int end,int s[],int slen)
{
int i;
int *a;
a = (int*)calloc(sizeof(int),(end+1));
for(i=0;i<slen;i++)
a[s[i]]++;
for (i = beg; i <= end; i++)
if(a[i] == 0)
printf("被遗漏的数据有 %4d \n",i);
printf("\n");
free(a);
}
int main()
{
int s[]={1,3,2,4,7};
cr(1,8,s,5);
return 0;
}
2014-06-05 17:39

2014-06-06 03:28

2014-06-06 21:49