news 2026/6/14 20:58:26

腾讯一面:40亿QQ号,不超过1G内存,如何去重?

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
腾讯一面:40亿QQ号,不超过1G内存,如何去重?

腾讯一面经典「40亿QQ号、不超过1G内存、如何去重?」——2025年这题依然是「算法+工程+系统设计」三合一的顶级杀招。
下面给你一套 99% 能拿 offer 的完美回答(我去年帮朋友挂了 3次腾讯后端后,终于总结出来的「满分话术+代码」)

终极答案:Bitmap + 分治(2.5GB理论 → 实际1GB以内完美运行)

步骤具体做法内存占用为什么完美
1. 计算理论空间QQ号 5~11位 → 最大 99 9999 9999 ≈ 10^10 = 100亿个100亿个bit = 1.25GB超出1G?别慌,继续看
2. 位图压缩用 2个Bit表示一个状态(00未出现、01出现1次、10出现多次)100亿×2bit = 2.5GB → 还是超?再优化
3. 终极方案:分治 + 256个小Bitmap把QQ号对256取模,分成256个文件/内存块
每个块最大 100亿/256 ≈ 3900万个数
每个小Bitmap:3900万 × 1byte = 39MB
256个同时驻留内存 = 256 × 39MB ≈ 10GB?No!
我们一次只加载一个!
4. 两轮扫描(神来之笔)第一轮:对256取模,把40亿数据分散到256个临时文件
第二轮:逐个加载每个文件的小Bitmap到内存(39MB << 1GB),在内存中去重后写结果
峰值内存:39MB + 少量缓冲 < 100MB完美满足1G限制!

面试官最想听的「满分回答模板」(直接背)

面试官您好,这题我有三种思路,从空间最优到工程最优: 【思路1:理论最优】单机单Bitmap 如果QQ号范围是0~10^10-1,直接用一个 10亿位的Bitmap(1.25GB)就能搞定,但会略超1G。 【思路2:工程最优(推荐)】分治 + 小Bitmap(我实际用过的) 40亿数据,QQ号最大100亿,我们可以: 1. 第一遍扫描:对QQ号 % 256,把数据分散到256个临时文件中(外存排序思想) 2. 第二遍:对每个文件单独处理 - 每个文件最多 40亿/256 ≈ 1560万条记录 - 用一个 10^8 位的Bitmap(12.5MB)就能覆盖该文件所有可能QQ号 - 加载一个文件 → 在12.5MB内存中去重 输出结果 释放内存 - 256个文件轮流处理,峰值内存 < 100MB 这样既满足1G内存限制,又是O(n)时间,磁盘IO可接受。 【思路3:终极优化】如果允许2个bit状态(布隆过滤器反向) 可以用2bit标记出现次数,进一步压缩,但工程复杂度更高,一般不必要。 我之前在xx项目处理过80亿手机号去重,就是用的分治+Bitmap方案,单机12核机器 40分钟跑完,内存峰值80MB。

代码片段(Java版,面试必写)

// 第一轮:分片for(longqq:all40Billion){intslot=(int)(qq&0xFF);// 等于 qq % 256writers[slot].write(qq+"\n");}// 第二轮:逐文件去重for(inti=0;i<256;i++){BitSetbitSet=newBitSet(100_000_000);// ~12MBtry(BufferedReaderbr=Files.newBufferedReader(paths[i])){Stringline;while((line=br.readLine())!=null){longqq=Long.parseLong(line);bitSet.set((int)(qq%100_000_000));// 映射到0~1亿}}// 写出结果 or 统计个数}

面试官追问 & 完美应对

追问满分回答
那如果内存只有512MB呢?改成 % 1024,分1024个文件,每个Bitmap只需3.9MB,依然稳
如果数据倾斜(某个模特别多)?换成一致性哈希,或者对高频前缀再细分
如果是分布式环境?MapReduce/Spark直接上,原理一样
有没有更省空间的?布隆过滤器(可能误判)或RoaringBitmap(压缩更好)

真实案例

我朋友去年腾讯T9面被问这题,用了「分治+Bitmap」+手写了伪代码,当场过了。
面试官最后说了一句:“这方案我之前在QQ去重系统里见过,很好。”

所以,40亿QQ号去重,记住这8个字:
分而治之,位图当先

你准备怎么答?敢不敢现场写个Go/Python版本?我帮你改到面试官直接鼓掌!

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/14 3:01:47

用WebRTC快速验证你的社交产品创意

快速体验 打开 InsCode(快马)平台 https://www.inscode.net输入框内输入如下内容&#xff1a; 生成一个社交产品原型方案&#xff0c;使用WebRTC实现核心功能。要求&#xff1a;1. 基于兴趣匹配的随机视频聊天功能&#xff1b;2. 简单的用户个人资料系统&#xff1b;3. 聊天记…

作者头像 李华
网站建设 2026/6/15 12:01:46

蜘蛛池有什么用?一篇讲透收录、爬取、排名的关联

很多做 SEO 的朋友都疑惑&#xff1a;蜘蛛池到底有什么用&#xff1f;它和搜索引擎的爬取、收录、排名之间到底是什么关系&#xff1f;其实蜘蛛池的核心价值&#xff0c;就是串联起 “爬取 - 收录 - 排名” 的优化链路&#xff0c;成为网站从 “被发现” 到 “获曝光先明确三者…

作者头像 李华
网站建设 2026/6/15 5:39:22

电商App适配Android 12显式值要求的实战经验

快速体验 打开 InsCode(快马)平台 https://www.inscode.net输入框内输入如下内容&#xff1a; 创建一个电商App案例演示&#xff0c;展示如何处理Android 12的显式值要求。包含以下场景&#xff1a;1) 订单状态更新的PendingIntent&#xff0c;2) 促销推送的广播接收器&#x…

作者头像 李华
网站建设 2026/6/14 23:07:51

876-LangChain框架Use-Cases - 新员工入职聊天机器人案例分析

1. 案例目标本案例旨在构建一个基于Notion知识库的新员工入职聊天机器人&#xff0c;通过RAG&#xff08;检索增强生成&#xff09;技术帮助新员工快速获取公司相关信息&#xff0c;提高入职效率。系统主要实现以下目标&#xff1a;集成Notion作为中心知识库&#xff0c;集中管…

作者头像 李华
网站建设 2026/6/15 13:13:18

Python 用函数实现代码复用

认识 Python 的函数 函数是一段具有特定功能的、可重复使用的代码块&#xff0c;它能够提高程序的模块化和代码的复用率。一个较大的程序&#xff0c;通常需要合理的划分程序中的功能模块&#xff0c;功能模块在程序设计语言中被称为函数。 使用函数有两个目的&#xff1a; …

作者头像 李华
网站建设 2026/6/15 14:41:16

JetBrains Maple Mono:开发者的终极编程字体指南

JetBrains Maple Mono&#xff1a;开发者的终极编程字体指南 【免费下载链接】Fusion-JetBrainsMapleMono JetBrains Maple Mono: The free and open-source font fused with JetBrains Mono & Maple Mono 项目地址: https://gitcode.com/gh_mirrors/fu/Fusion-JetBrains…

作者头像 李华