非常简单的问题 寻求高手方案
比如:有数组(或者 整数序列) int s[]={1,3,2,4,7};
求在序列1-8中 有哪个数字被遗漏了
我的输出是 :
被遗漏的数据有 5
被遗漏的数据有 6
被遗漏的数据有 8
但是我的代码却是用的比较暴力的枚举办法 很是想知道其他方案
#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数组 记录已有的数字。
#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; }
#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; }