今天去腾讯面试, 面试官出了一道题:
有10亿个整数, 不重复, 不连续. (整数的范围按32位平台计算. 范围为0~2^32).
求: 这10亿个整数中, 值在中间的那个数 (即第5亿个大的那个数).
面试官给我的答题时间是他抽完一根烟的时间. 结果悲剧了. 他只用了一分钟左右就抽完了.而我却没做出来.
回来细想, 根据面试官的提示. 想到用位来做最好.
将一个整数对应一个bit. 所以 0~2^32之间所有整数, 可以用2^32 * 1bit / 8 = 2^29 B = 512MB. 这样可以在内存里申请512M内存来保存.
----->假设整数与位组之间的映射关系为1对应第1位, 2,对应第2位, ..., 2^32对应最后一位.
对10亿个数做一次遍历. 如果某个数存在, 就在相应的位组位置标记为1. 最后位组有10亿个1.
还记得整数与位组对应的关系吗?
位组从头开始查找第5亿个1所在的位置就是中间值的那个数.