2.5亿个整数(范围是从1到2.5)中找出不重复的整数的个数,内存空间不足以容纳这2.5亿个整数。
解决思路是利用bitmap,此处将问题简化,考虑一个数组,数组中保存这20个数,这些数的范围是1到20.编写函数将数组中重复的数字去掉,且占用的额外空间最小。
#include <iostream>
#define byteSize 8
#define numMax 20
using namespace std;
void setbit1(char* p,int num){
int pos=num/byteSize;//确定num所在的p数组的索引
int moveBits=num%byteSize;//当前数组索引处数字要移动的位数
if((p[pos]>>moveBits&0x01)==0x00){{//如果传入的num所在的位处为0;
p[pos]=p[pos]|(0x01<<moveBits);//将该位置1
}
}
void deleteRepeatNum(int a[],int n){
int byteNum;
if(numMax/byteSize==0)
byteNum=numMax/byteSize;
else byteNum=numMax/byteSize+1;
char* p= new char[byteNum];
memset(p,0,byteNum);
for(int i=0;i<n;i++){
setbit1(p,a[i]);
}
for(int j=0;j<numMax;j++){//输入去重后的结果
if((p[j/byteSize]>>j%byteSize&0x01)!=0x00)
cout<<j<<"_";
}
}
int main(){
int a[20]={1,1,2,10,2,3,15,6,9,8,11,11,19,14,13,15,15,18,19,17};
deleteRepeatNum(a,20);
return 0;
}