在磁盘上有一个文件,里面只含有(2的32次方-1)个数字,每个数字都是处于[0,2的32次方]之间。
但是可以使用的内存仅仅有数百K字节左右。
但是可以使用的内存仅仅有数百K字节左右。
请使用任何一种编程语言(伪代码也行),找出任意一个属于[0,2的32次方]之间并且没有在这个文件中出现数字。
如下:
开一个unsigned int count[0..0xFFFF] 的数组。需要65535 * 4 / 1024 = 252KB的内存。
初始化为0.
然后做一次扫描,每读一个数字K,则其低字的计数器加一,即: count[ k & 0xFFFF ] ++;
扫描完整个文件之后,至少会有一个计数器的值小于 0x10000,说明这个低字等于该值的数字至少有一个没有出现。
记下该值,设为low
然后再次将count数组清0。再做第二次扫描,对于每一个数字K,先判断其低字是否等于 low ,若等于,则将其高字的计数器加一,即: count[ k >> 16 ]++;
然后再扫描一遍count数组,只要是count[i] == 0的,就说明高字为i ,且低字为low的数字没出现过。
此时 (i << 16) | low 为所求。