2个回答
展开全部
追求效率的话,肯定得用C++
整数有范围限制吗?如果范围小的话,可以打表,比如1000万以内的数字的话,用1M多的bit表就可以一次性筛选出来。int范围的话,用512M内存,可以一次循环扫过,但是内存开销太大
如果没有内存上的限制 这个方法绝对是最快的。而且也可以找到重复的
如果没有范围,或者范围太大,不适合达标,可以用C++ STL中的priority_queue 依次压入 然后弹出,有重复的去掉
整数有范围限制吗?如果范围小的话,可以打表,比如1000万以内的数字的话,用1M多的bit表就可以一次性筛选出来。int范围的话,用512M内存,可以一次循环扫过,但是内存开销太大
如果没有内存上的限制 这个方法绝对是最快的。而且也可以找到重复的
如果没有范围,或者范围太大,不适合达标,可以用C++ STL中的priority_queue 依次压入 然后弹出,有重复的去掉
追问
怎么个打表法,可不可以将程序大体写来看看
追答
假定内存足够,整数范围为正整数0-100万
那么每个Bit对应一个数字 100万需要内存为1000000/8=125000
程序可以写成这样
#include
unsigned char map[125000];
int main()
{
int i, a;
for(i = 0; i < 10000; i ++)
{
scanf("%d", &a);
if(map[a/8] & (1<<(a%8)))
printf("%d is repeat\n", a);
else map[a/8]|=1<<(a%8);
}
}
大致就是这样,从0开始计数,每个数值对应一位(1个bit),然后读入数据,如果没有记录过这个数据,那么这一位为0,把它置成1, 如果已经是1,表示这个数字是重复的
这种算法最大的优势就是快。一次循环搞定,而且所有操作都是位运算
缺点就是浪费内存,另外只能判断重复,却不能判断重复次数,重复一次和重复十次效果相同
展开全部
public Set distinctData()
{
Map<String ,Object> map=new Map<String ,Object>();
for(int i=0;i<10000;i++)
{
String str=""+你的整数数据;
map.put(str,i);
}
return map.keySet();
}
for(String s: distinctData())
{
System.out.println(Integer.parseInt(s));
}
{
Map<String ,Object> map=new Map<String ,Object>();
for(int i=0;i<10000;i++)
{
String str=""+你的整数数据;
map.put(str,i);
}
return map.keySet();
}
for(String s: distinctData())
{
System.out.println(Integer.parseInt(s));
}
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询