问题描述:
一个整形数组里除了m个数字之外,其他数字都出现两次。找出这些出现一次的数字。要求时间复杂度为O(n)。
实现代码如下:
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#include <limits.h>
#define mask 0x1F
#define BITSPERWORD 5
void setBitMap(int *bitmap,int b){
bitmap[b>>BITSPERWORD]^=1<<(b&mask);
}
int compare(int *bitmap,int b){
return bitmap[b>>BITSPERWORD] & 1<<(b&mask);
}
void findNum(int *num,int len){
if(num==NULL || len<=0)return ;
int i,j=0;
int bitmap[1+len>>BITSPERWORD];
for(i=0;i<len;i++){
setBitMap(bitmap,num[i]);
}
for(i=0;i<len;i++){
if(compare(bitmap,num[i])>0){
printf("%d\t",num[i]);
}
}
}
int main(int argc, char *argv[])
{
int num[]={
1,1,2,2,3,3,4,5,6,6,7,8
};
int len = sizeof(num)/sizeof(int);
findNum(num,len);
return 0;
}
在这个算法中,我将剑指offer中的问题扩展了一下,使用bitmap来实现。
参考资料:
剑指offer
备注:
转载请注明出处:http://blog.youkuaiyun.com/wsyw126/article/details/51384344
作者:WSYW126