zoukankan      html  css  js  c++  java
  • 找到没出现的数

    题目说明:
    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,但是只用找到一个没出现过的数即可。

  • 相关阅读:
    解决ORACLE存储过程锁定的问题
    #{propName,attr1=val1,attr2=val2}
    集成confluence与jira
    jira4.1.1安装
    Mac OS X 10.6下安装MySQL 5.1.45
    JIRA+MySQL配置
    xcode4.5 iOS6 cocos2dx 横屏解决方案
    gSoap
    Jira5.0.2安装及破解
    MFC中显示cocos2dx
  • 原文地址:https://www.cnblogs.com/shuzhiwei/p/11316623.html
Copyright © 2011-2022 走看看