40亿非负整数中找到出现两次的数和所有数的中位数
题目:
32为无符号整数的范围是0~4294967295,现在有40亿个无符号整数,可以使用最多1GB的内存,找出所有出现了两次的数。
补充题目:
可以使用最多10MB的内存,怎么找到这40亿整数的中位数。
解答:
对于原问题,可以用bit map的方式来表示数出现的情况。具体地说,是申请一个长度为4294967295*2的bit类型的数组bitArr,用2个位置表示一个数出现的词频,1B占用8个bit,所以长度为4294967295*2的bit类型的数组占用1GB空间。怎么使用这个bitArr数组呢?遍历这40亿个无符号数,如果初次遇到num,就把bitArr[num*2 + 1]和bitArr[num*2]设置为01,如果第二次遇到num,就把bitArr[num*2 + 1]和bitArr[num*2]设置为10,如果第三次遇到num,就把bitArr[num*2 + 1]和bitArr[num*2]设置为11。以后再遇到num,发现此时bitArr[num*2 + 1]和bitArr[num*2]已经被设置为11,就不再做任何设置。遍历完成后,再次遍历bitArr,如果发现bitArr[i*2 + 1]和bitArr[i*2]设置为10,那么i就是出现了两次的数。