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

  • 相关阅读:
    近期用过的Linux口令备份
    使用白鹭引擎遇到的一些问题以及一些工具分享
    隐私政策
    又是一年年终总结
    初次数据整理
    skynet的timer似乎有问题
    golang .(type)语法
    mysqlbinlog输出sql
    Mysql中文字符串提取datetime
    ionic4请求skynet服务器的资源跨域问题
  • 原文地址:https://www.cnblogs.com/shuzhiwei/p/11316623.html
Copyright © 2011-2022 走看看