• 找到没出现的数


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

  • 相关阅读:
    JavaScript类型转换
    JavaScript中的 typeof,null,和undefined
    JavaScript循环
    JavaScript条件语句
    JavaScript运算符
    JavaScript字符串
    JavaScript事件
    JavaScript对象,函数,作用域
    JavaScript基础
    数值数据的特征预处理
  • 原文地址:https://www.cnblogs.com/shuzhiwei/p/11316623.html
Copyright © 2020-2023  润新知