腾讯三面:40亿个qq号码如何去重复登录

今天,我们来聊一道常见的考题,也出现在腾讯面试的三面环节,非常有意思。具体的题目如下:

文件中有40亿个QQ号码,请设计算法对QQ号码去重,相同的QQ号码仅保留一个,内存限制1G.

这个题目的意思应该很清楚了,比较直白。为了便于大家理解,我来画个动图玩玩,希望大家喜欢。

腾讯三面:40亿个QQ号码如何去重?

能否做对这道题目,很大程度上就决定了能否拿下腾讯的offer,有一定的技巧性,一起来看下吧。

在原题中,实际有40亿个QQ号码,为了方便起见,在图解和叙述时,仅以4个QQ为例来说明。

方法一:排序

很自然地,最简单的方式是对所有的QQ号码进行排序,重复的QQ号码必然相邻,保留第一个,去掉后面重复的就行。

原始的QQ号为:

腾讯三面:40亿个QQ号码如何去重?

排序后的QQ号为:

腾讯三面:40亿个QQ号码如何去重?

去重就简单了:

腾讯三面:40亿个QQ号码如何去重?

可是,面试官要问你,去重一定要排序吗?显然,排序的时间复杂度太高了,无法通过腾讯面试。

方法二:hashmap

既然直接排序的时间复杂度太高,那就用hashmap吧,具体思路是把QQ号码记录到hashmap中:

mapFlag[123] = truemapFlag[567] = truemapFlag[123] = truemapFlag[890] = true

由于hashmap的去重性质,可知实际自动变成了:

mapFlag[123] = truemapFlag[567] = truemapFlag[890] = true

很显然,只有123,567,890存在,所以这也就是去重后的结果。

可是,面试官又要问你了:实际要存40亿QQ号码,1G的内存够分配这么多空间吗?显然不行,无法通过腾讯面试。

方法三:文件切割

显然,这是海量数据问题。看过很多面经的求职者,自然想到文件切割的方式,避免内存过大。

可是,绞尽脑汁思考,要么使用文件间的归并排序,要么使用桶排序,反正最终是能排序的。

既然排序好了,那就能实现去重了,貌似就万事大吉了。我只能坦白地说,高兴得有点早哦。

接着,面试官又要问你:这么多的文件操作,效率自然不高啊。显然,无法通过腾讯面试。

方法四:bitmap

来看绝招!我们可以对hashmap进行优化,采用bitmap这种数据结构,可以顺利地同时解决时间问题和空间问题。

在很多实际项目中,bitmap经常用到。我看了不少组件的源码,发现很多地方都有bitmap实现,bitmap图解如下:

腾讯三面:40亿个QQ号码如何去重?

这是一个unsigned char类型,可以看到,共有8位,取值范围是[0, 255],如上这个unsigned char的值是255,它能标识0~7这些数字都存在。

同理,如下这个unsigned char类型的值是254,它对应的含义是:1~7这些数字存在,而数字0不存在:

腾讯三面:40亿个QQ号码如何去重?

由此可见,一个unsigned char类型的数据,可以标识0~7这8个整数的存在与否。以此类推:

  • 一个unsigned int类型数据可以标识0~31这32个整数的存在与否。
  • 两个unsigned int类型数据可以标识0~63这64个整数的存在与否。

显然,可以推导出来:512MB大小足够标识所有QQ号码的存在与否,请注意:QQ号码的理论最大值为2^32 – 1,大概是43亿左右。

接下来的问题就很简单了:用512MB的unsigned int数组来记录文件中QQ号码的存在与否,形成一个bitmap,比如:

bitmapFlag[123] = 1bitmapFlag[567] = 1bitmapFlag[123] = 1bitmapFlag[890] = 1

实际上就是:

bitmapFlag[123] = 1bitmapFlag[567] = 1bitmapFlag[890] = 1

然后从小到大遍历所有正整数(4字节),当bitmapFlag值为1时,就表明该数是存在的。

而且,从上面的过程可以看到,自动实现了去重。显然,这种方式可以通过腾讯的面试。

腾讯三面:40亿个QQ号码如何去重?

扩展练习一

文件中有40亿个互不相同的QQ号码,请设计算法对QQ号码进行排序,内存限制1G.

很显然,直接用bitmap, 标记这40亿个QQ号码的存在性,然后从小到大遍历正整数,当bitmapFlag的值为1时,就输出该值,输出后的正整数序列就是排序后的结果。

请注意,这里必须限制40亿个QQ号码互不相同。通过bitmap记录,客观上就自动完成了排序功能。

扩展练习二

文件中有40亿个互不相同的QQ号码,求这些QQ号码的中位数,内存限制1G.

我知道,一些刷题经验丰富的人,最开始想到的肯定是用堆或者文件切割,这明显是犯了本本主义错误。直接用bitmap排序,当场搞定中位数。

扩展练习三

文件中有40亿个互不相同的QQ号码,求这些QQ号码的top-K,内存限制1G.

我知道,很多人背诵过top-K问题,信心满满,想到用小顶堆或者文件切割,这明显又是犯了本本主义错误。直接用bitmap排序,当场搞定top-K问题。

扩展练习四

文件中有80亿个QQ号码,试判断其中是否存在相同的QQ号码,内存限制1G.

我知道,一些吸取了经验教训的人肯定说,直接bitmap啊。然而,又一次错了。根据容斥原理可知:

因为QQ号码的个数是43亿左右(理论值2^32 – 1),所以80亿个QQ号码必然存在相同的QQ号码。

海量数据的问题,要具体问题具体分析,不要眉毛胡子一把抓。有些人完全不刷题,肯定不行。有些人刷题后不加思考,不会变通,也是不行的。好了,先说这么多。我们也会一步一个脚印,争取每篇文章讲清讲透一件事,也希望大家阅读后有所收获,心情愉快。

声明:本网页内容旨在传播知识,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:dandanxi6@qq.com

(0)
上一篇 2023年 3月 9日 下午12:34
下一篇 2023年 3月 9日 下午12:41

相关推荐

  • 微信绑定了银行卡要记得这样设置

    大家好,我是小俊,一个专注于知识分享的博主!那今天小俊就给大家分享一下,我们微信里面如果有绑定银行卡的话,那么这个地方一定要把它打开,打开之后啊,我们在里面放再多的钱,绑定多少银行…

    2023年 6月 11日
  • 华为手机怎么解锁bootloader

    申请解锁码 打开的官方解锁界面中,输入手机产品的型号,以及“SN”、“MEID”和产品识别码,点击“提交”按钮。 待收到解锁码后,下载“一键安装ADB工具”,利用该工具来解锁华为m…

    数码教程 2023年 4月 30日
  • 目前世界上最贵的手机多少钱(世上最贵的手机多少钱)

    苹果iPhone的价格本来就不便宜,而今年iPhone X发布之后更是让众多网友直呼不能忍。该机最便宜也要8388元,最高达到了9688元。其实小编想说,这款产品跟以下这些手机相比…

    2024年 1月 10日
  • 如何把照片制作成抖音影集

    昨天有一位粉丝朋友问我,说如何把手机相册中的照片制作成视频或者是影集。 确实是在生活中,也很多人都喜欢用手机拍照,有时候,也很想把好看的照片制作成动感的影集来分享到朋友圈儿或者是给…

    2023年 2月 5日
  • 色情漫画瞄准特定群体!网络色情暗流亟须综合治理

    *本文为《半月谈》2023年第11期内容 “我过几天就要中考了,这两天不能看咱们漫画图片了。”“没事,更新连载后我帮你保存,等你考完了就能看到。”这是一名年仅15岁的初中生与“羞羞…

    2023年 7月 9日
  • 如何设置聊天背景,如何设置聊天背景图片

    微信聊天的背景一般是微信默认的普通的白色背景,这些背景看起来比较单调,如何快速地换成自己喜欢的背景呢? 打开微信,点右下角的【我】点击【设置】 接着点【聊天】弹出的页面,点【聊天背…

    2023年 10月 8日
  • 一文了解微信加群的三种方法(微信加群有好的方法吗)

    微信群是微信中一种不需要添加好友,多人聊天交流的群组。如果你想加入一个微信群,共有三种通用的加群方式,一是通过他人邀请加群、二是通过二维码加群、三是通过面对面建群。下面我们来详细了…

    2023年 5月 26日
  • APP上架流程,ios 实用的app

    前言:作为一名 iOS 开发工程师, APP 的上架是必备技能. iOS 上架的流程主要可以简单总结为: 一个包,两个网址,三个证书, 一个包: iPA 包,上架用的. 两个网址:…

    2023年 3月 20日
  • 手机充电的正确做法(手机还剩多少电是充电最佳)

    关于手机充电的最佳做法,我们之前可能存在一些误解。事实上,将手机充电至100%然后再拔掉充电器是不推荐的做法。这种做法可能会导致电池的寿命缩短。 现代智能手机通常使用锂离子电池,这…

    2023年 7月 23日
  • 一个草料二维码怎么生成链接网址

    短链接是怎样生成的?免费二维码转换成链接网址怎么实现 随着互联网的发展,人们越来越多的使用网络购物、在线支付等,因此网站的流量也越来越大,网站需要不断地更新内容,才能吸引更多的用户…

    2023年 8月 28日