每日一题【二】-数组元素去重

来源:互联网 发布:java集合类有哪些 编辑:程序博客网 时间:2024/06/04 20:13

2.5亿个整数(范围是从1到2.5)中找出不重复的整数的个数,内存空间不足以容纳这2.5亿个整数。

解决思路是利用bitmap,此处将问题简化,考虑一个数组,数组中保存这20个数,这些数的范围是1到20.编写函数将数组中重复的数字去掉,且占用的额外空间最小。


#include <iostream>#define byteSize 8#define numMax 20using 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;}


原创粉丝点击