找到没出现的数

题目说明:
40亿个非负整数中找到没出现的数

题目要求:
最多使用1GB内存

实现思路:
32位无符号整数的范围是0~4294967295,现在有一个正好包含40亿个无符号整数的文件,所以在整个范围中必然有没出现过的数。可以使用最多1GB的内存,怎么找到所有没出现过的数?

如果用整数数组来保存出现过的数,那么如果40亿个数都不同,存一个32位整数需要4B,所以最差情况下需要40亿×4B=160亿字节,大约需要16GB的空间,这是不符合要求的。

由此,我们可以使用BitSet的方式来表示数出现的情况。具体地说,是申请一个长度为4294967295的BitSet,每个位置只可以表示0或1状态。8个bit为1B,所以长度为4294967295的bit类型的数组占用500MB空间。

怎么使用这个bitArr数组呢?就是遍历这40亿个无符号数,例如,遇到7000,就把bitArr[7000]设置为1。遇到所有的数时,就把bitArr相应位置的值设置为1。
遍历完成后,再依次遍历bitArr,哪个位置上的值没被设置为1,哪个数就不在40亿个数中。例如,发现bitArr[8001]==0,那么8001就是没出现过的数,遍历完bitArr之后,所有没出现的数就都找出来了。


进阶:内存限制为10MB,但是只用找到一个没出现过的数即可。

 

转载于:https://www.cnblogs.com/shuzhiwei/p/11316623.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值