//位图法实现查找数组中重复数字/
#include<stdio.h>
#include<stdlib.h>
#include<memory.h>
#define SHIFT 5 //一个int型的变量最多可以存储0-31个数字2^5
#define MAXLINE 32
#define MASK 0x1F31
设置整型数存储的位置bitmap为整型数组(若为字符数组,则32->8)
///存储的字节位置:bitmap[i/32]
///存储的位位置:i&31
void setbit(int *bitmap,int i)
{
bitmap[i>>SHIFT]|=(1<<(i&MASK));
}
/获取指定位的数字
bool getbit(int *bitmap,int i)
{
return bitmap[i>>SHIFT]&(1<<(i&MASK));
}
int Max(int *arr,int len)
{
int result=arr[0];
for(int i=1;i<len;i++)
if (arr[i]>result)
{
result=arr[i];
}
return result;
}
寻找数组中出现的第一个重复元素
void FindTheFirReNum(int *arr,int len)
{
int result=-1;
int arrmax=Max(arr,len);
int maplen=(arrmax>>SHIFT)+1;
int *arrmap=(int*)malloc(sizeof(int)*maplen);
if(arrmap==NULL)
exit(0);
memset(arrmap,0,maplen);
for(int i=0;i<len;i++)
{
if(getbit(arrmap,arr[i]))
{
result=arr[i];
break;
}
else
setbit(arrmap,arr[i]);
}
printf("The First Repeated Num of the array is:");
printf("%d\n",result);
free(arrmap);
}
寻找数组中出现重复元素
void FindTheReNum(int *arr,int len)
{
int *result=(int *)malloc(sizeof(int)*len);
int k=0;
int arrmax=Max(arr,len);
int maplen=(arrmax>>SHIFT)+1;
int *bitmap=(int*)malloc(sizeof(int)*maplen);
memset(bitmap,0,maplen);
for(int i=0;i<len;i++)
{
if(getbit(bitmap,arr[i]))
result[k++]=arr[i];
else
setbit(bitmap,arr[i]);
}
printf("The Repeated Num of the array is:");
for(int j=0;j<k;j++)
printf("%d\t",result[j]);
free(result);
result=NULL;
free(bitmap);
bitmap=NULL;
}
int main()
{
int arr[]={4,66,45,324,3,5,45,66};
int len=sizeof(arr)/sizeof(arr[0]);
FindTheFirReNum(arr,len);
FindTheReNum(arr,len);
system("pause");
}
位图法寻找数组中重复出现的数字
最新推荐文章于 2020-12-23 07:06:25 发布