栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > Java面试题

一个int类型的数组 里面有一万个int数字 如何用循环算出有多少对相同的数字 假设相同数字全都只有一对

Java面试题 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

一个int类型的数组 里面有一万个int数字 如何用循环算出有多少对相同的数字 假设相同数字全都只有一对

用bitmap算法,O(n),就可以实现,当然hash也可以实现,只不过hash算法要设计好,不能有冲突。这道题数据量还是太小,用hashtable更合适,如果数据量再大就用bitmap更合适了。

因为数字为int,而有符号的int最大值为23亿,unsigned int最大为42亿多,假设题目是有符号的,则建立一个23亿大小的bit数组,转为成int数组即为(23亿/32 + 1)长度(int为4字节,32bit位),内存消耗为23亿/8/1024/1024大约等于271M,内存完全可以满足。因为题目要求只统计相同的对数。所以在设置一个统计的变量sum。假如该bit位上值为1,说明之前有过该值了。

下面是bitmap算法的举例说明:

所谓的bitmap就是用一个bit位来标记某个元素对应的value,而key则是该元素。由于 采用bit为单位来存储数据,因而可以大大节省内存空间,因此bitmap多用于对打数据上。 下面通过一个例子来了解bitmap:

假设我们要对0-7内5个数(4,2,2,3,3)统计重复,那么我们可以用bitmap来实现。 首先我们用普通方法表示这个5个数,我们需要5byte。再来看看用bitmap来表示,因为 数值范围为0-7,即最多8个数,则只需要8bit,即为1byte。具体方法如下:

1、首先分配1byte空间,所有bit位赋值0,如下: 

 

00000000

2、然后遍历这5个数,第一个数为4,则把第4个bit位赋值1 

 

00010000(从0计数,从右往左)

3、以此类推,剩余计算过程如下:

   00010100(第二个数2)

   00010100(第三个数2,因为该位已经为1,所以sum++)

   00011100(第四个数3)

   00011100(第五个数3,该位已经为1,sum++)

 

最后sum为2,即重复数字对数。时间复杂度为O(n),内存占用量为270M左右。

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/263573.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号