
去年秋招帮我师弟改简历的时候翻到他收藏夹里躺着一份“字节跳动2017客户端工程师实习生笔试题”的帖子。他问我这题还有没有参考价值我告诉他别只看题要看题背后那群出题人想摸清的底牌。六年过去移动端技术栈换了不止一波但大厂客户端笔试的考察内核说真的变化没有很多人想象得那么大。如果你正在准备客户端岗位的实习或校招这份2017年的题目依然是一份难得的“解剖样本”。这篇文章我想顺着这份笔试题把客户端笔试真正会遇到的坎、需要提前铺好的底子、以及那些刷题刷不到但考场一定会踩的坑一次性说清楚。不灌鸡汤只讲实操。1. 2017年这道题背后的考察逻辑字节面试官到底在筛什么人先说一个很多人会误解的点客户端工程师的笔试为什么考的全是算法和数据结构而不是Java、Objective-C或者Android SDK2017年正值今日头条系产品高速扩张期客户端团队需要的人才画像很清晰基础扎实、代码严谨、有足够的算法训练量来应对业务复杂度。客户端开发听起来是“UI接口”的活但一旦涉及列表优化、并发调度、缓存淘汰、增量更新数据结构和算法就是那层“房梁”平时看不见风一吹就知道结不结实。那套笔试题的题型分布大致是这样的题型占比考察目的编程题算法约50%-60%编码能力、复杂度意识、边界处理选择题基础综合约20%-30%操作系统、网络、语言基础简答/设计题约10%-20%客户端场景理解和方案设计换句话说笔试筛选的第一关不是你会不会用RecyclerView而是你有没有扎实的计算机底层功底。这和很多同学“背完面试题就去笔试”的策略天然就是错位的。还有一个容易被忽略的点字节2017年的笔试时间非常紧凑两个小时左右要完成多道编程题和选择题。这意味着什么意味着你不仅要做对还要做得快。刷题时依赖“看一眼题想十分钟再翻翻笔记”这种节奏的人在真实考场上是会崩盘的。另外2017年这批题目还有几个标志性特征后来几年也一直延续偏向工程化场景题干经常包装成“客户端实际遇到的问题”比如网络请求超时重试、内存缓存淘汰、列表数据合并。不考偏题怪题没有出现复杂的计算几何、数论或太多状态压缩DP考察集中在高频的数据结构和常规算法思想上。对复杂度有明确要求暴力解法往往只能过部分用例想拿满分必须给出更优的时间/空间复杂度方案。所以与其说这是在考算法不如说是在用算法这个标尺快速筛掉“工程素养不达标”的候选人。理解这一点你备考的方向就不会跑偏。2. 核心考点拆解算法、操作系统与网络一个都不能少如果把2017年这套题拆开来看考点主要集中在下面几个板块。每个板块背后都有它在客户端开发中的真实投射。2.1 数据结构面试官偏爱数组、链表、二叉树和哈希表先说数组和链表。客户端开发天天在处理列表数据——聊天记录、信息流、本地缓存。这些场景天然就是数组和链表的「主场」。笔试里常见的考察方式包括链表反转、环形链表检测、合并两个有序链表数组中的两数之和、三数之和、滑动窗口最大值有序数组的二分查找变种旋转数组、查找第一个大于等于目标值的位置那时候的题目偏爱考不需要额外空间的原地操作经常在题目末尾加上一句“要求空间复杂度O(1)”。这就是在提醒你别一上来就开一个新的数组/链表先想想怎么把指针玩明白。二叉树在客户端笔试中的出镜率也非常高。因为客户端里视图树、布局层级、文件目录结构本质都是树。常见的考察方向二叉树的前中后序遍历递归版迭代版都要会层序遍历二叉树的最大/最小深度最近公共祖先根据前序中序重建二叉树哈希表就更不用说了几乎所有需要快速查找的场景都会用到它。要特别留意的点是哈希表在解决“两数之和”“字符计数”“滑动窗口去重”时的灵活运用。很多人知道哈希表O(1)查找但真到做题时想不到该在什么时候把它掏出来这就说明刷题时没有建立“场景到结构”的映射意识。2.2 高频算法思想二分、动态规划、递归与回溯动态规划和贪心是2017年笔试题里的重头戏。不是说要你掌握多么冷门的DP优化而是最经典的模型必须滚瓜烂熟最长递增子序列0-1背包问题爬楼梯/斐波那契编辑距离最大子数组和我见过太多同学在准备客户端笔试时觉得“客户端又不搞推荐算法考什么DP”于是直接跳过动态规划。结果一上考场遇见一道编辑距离的变种题直接懵掉。这里想说一句可能不那么中听的话笔试不是按“工作内容”出题的是按“候选人区分度”出题的。DP就是那个最经典的区分工具。递归与回溯则是另一个高频区尤其是排列组合类的题目。比如给定一个数字字符串返回所有可能的字母组合或者求一组数的全排列要求不重复。这类题在客户端开发里对应的是“状态穷举”的思路比如拼图游戏、搜索自动补全、路由匹配规则等。2.3 操作系统进程线程、死锁和内存管理是必考区2017年的选择题里操作系统占的份额不小。它考察的内容其实非常集中进程与线程的区别、线程间通信方式死锁产生的四个必要条件进程调度算法虚拟内存、页面置换算法用户态和内核态的切换这些知识点对客户端开发有什么用举几个真实场景App启动时为什么卡因为主线程做了太多耗时操作系统调度不过来。列表滑动为什么掉帧因为UI线程被其他线程的锁阻塞了。崩溃日志里的OOM是什么本质是内存管理出了问题。所以笔试考操作系统考的其实是你是否具备“从系统角度理解App运行状态”的能力。建议备考时不要死记概念而是把每个知识点映射到一个客户端现象上。2.4 计算机网络TCP/IP和HTTP是客户端工程师的“空气”客户端工程师每天都在和网络打交道——请求接口、上传图片、下载资源、长连接推送。2017年笔试中网络部分的考察集中在TCP三次握手、四次挥手TCP与UDP的区别HTTP请求方法和状态码HTTP与HTTPS的区别滑动窗口与拥塞控制这里有一个普遍的备考误区把网络协议背得滚瓜烂熟但没有真正理解“为什么这样设计”。比如问你TCP为什么要三次握手而不是两次因为它要确认双方的收发能力都正常。为什么要四次挥手因为TCP是全双工的两个方向的连接需要分别关闭。一旦把这些问题想透了做题时你就能面对一堆“看似都对”的选项里迅速定位到真正的原因而不是靠记忆硬猜。3. 看懂那几年必考的“客户端思维”题不只是算法除了纯粹的算法题字节2017年的笔试题里还有一类题特别值得注意——用算法外壳包装的客户端场景题。这类题是客户端岗位和其他岗位最大的区别所在。随便举几个我印象中的例子场景一LRU缓存淘汰机制题干大致是设计一个数据结构支持get和put操作并且要求时间复杂度为O(1)当缓存满时淘汰最久未使用的key。这题表面是考数据结构设计但真正的意图是看你有没有想过手机App里的图片缓存是怎么做的为什么Glide、Picasso都要做内存缓存为什么是LRU而不是FIFO如果你做过图片加载优化这题就是送分题。但如果你只是死记硬背“LinkedHashMap 双向链表”的解法面试官多问一句“为什么不用FIFO”就可能露馅。场景二多线程下载/断点续传这类题目通常不会让你写完整实现而是给你一段伪代码让你找出其中的并发问题。考察点包括多个线程同时写入同一个文件如何保证数据不交错如何记录每个分片的下载进度网络中断后如何从断点续传如何避免重复下载同一分片这类题在笔试中叫“代码题”在面试中叫“项目深挖”本质上是一回事你真的理解客户端领域的并发与IO处理吗场景三TopK问题有一道很经典的高频题——在海量数据中找出出现频率最高的K个元素。在客户端里对应的场景是统计用户点击事件中出现最多的几个控件、分析Crash日志中TopN的异常类型。这题的常规解法是哈希表小顶堆时间复杂度O(n log k)。如果你能在笔试现场把它和客户端场景联系起来不仅能把题做对还能在后续的面试中多一个可以聊的亮点。备考建议做这类题时不要只看题解要逼自己多问一句“这个数据结构/算法在客户端里真正用在哪”。把答案落到场景里才是客户端笔试高分的核心心法。4. 笔试时间分配与答题顺序实战策略比想象中更重要题目会做和考试能过中间还隔着一道坎时间分配。我见过不止一个同学拿到试卷先从头到尾认真做选择题结果做到编程题时只剩二十分钟明明会写的题也没时间写完。针对字节这类“算法占比高、时间紧凑”的笔试我建议按以下策略分配时间先花3-5分钟通读全卷对题量和难度做一个快速评估。优先做编程题尤其是那些“思路明确、代码量大”的题。编程题的分值通常最高而且一旦AC就是实打实的分数。选择题放在中间做遇到卡壳的题先标记不要恋战。留出最后10-15分钟检查重点检查编程题的边界条件空数组、单个元素、溢出情况和代码规范。关于编程题的答题顺序还有一个细节建议先做自己最有把握的题建立正反馈再做中等难度的题最后啃难题。笔试是限时竞技不是学术研究你的目标是在有限时间内拿尽可能多的分而不是证明自己能解出最难的题。还有一个很多人忽视的点代码的“可读性”和“工程规范”会直接影响评分。有些笔试平台支持人工阅卷面试官会看你写的代码是否命名清晰、是否有注释、是否有防御性编程意识。我在实际面试中见过太多代码逻辑能跑但变量名全是a、b、c、tmp函数几百行没有拆分边界处理全靠“碰运气”。这种代码就算AC了在面试官心里也是要扣分的。所以从备考阶段就要养成好习惯变量命名要有意义index、current、maxSum核心逻辑加一两行注释解释“为什么这样做”判断边界条件优先于主干逻辑能用const/final的地方就用函数尽量短小一个函数只做一件事这些习惯不仅为了笔试得分更是你进入团队后写生产代码的基本素养。5. 语言选择的博弈C、Java还是Python2017年的笔试系统通常支持多种编程语言但你自己选什么语言会直接影响答题速度和容错率。如果你主攻Android客户端首选Java/Kotlin。因为后续的技术面试和项目考察都基于这个技术栈笔试用同一门语言顺手且不需要切换思维。但要注意Java写算法题有时会比较啰嗦——比如定义一个Pair、写一个比较器都需要额外的代码量。考场时间紧凑这一点会被放大。如果你主攻iOS客户端通常用Objective-C或Swift。Swift的语法在现代和简洁程度上比OC好很多但在2017年的环境下Swift的编译速度和语言稳定性还不像今天这么好。现在2024年再看Swift已经完全可以作为笔试首选语言了。如果你只是想“保过笔试”而不是深耕某一端Python是一个策略性选择。它的代码量最小、调试成本最低、不需要处理繁琐的类型声明在限时答题中优势非常明显。但它的代价是面试环节如果问到你用什么语言写算法Python可能会引出“你是为了笔试才用Python吧”这类追问如果项目又是Java/Android背景可能会给人“准备不充分”的印象。我的建议是如果你确定走客户端方向笔试语言和你的主语言保持一致。虽然前期写起来可能比Python痛一点但这是迟早要过的坎早过比晚过好。6. 一些“捡分”技巧和很容易踩的坑带过好几届实习生之后我发现笔试中存在大量“非技术性丢分”。这些丢分点不是你不会而是你不够仔细。6.1 审题不清是最大的丢分原因很多同学拿到题目看到熟悉的影子就开始写写完一跑发现连示例都过不去再回头看题才发现把“非递减”看成了“递增”把“最多K次操作”看成了“恰好K次”。建议动手写代码之前花30秒把题干完整读两遍把限制条件数据范围、时间复杂度要求、输入输出格式用笔标出来。尤其是以下几类信息数组长度范围可能暗示你是否需要O(n log n)或更优算法是否需要处理负数/重复值/空输入输出格式是否有特殊要求比如是否需要排序输出是否要求稳定排序、原地操作、空间复杂度O(1)6.2 边界条件测试要养成肌肉记忆代码写完后不要急着提交先用几个经典边界数据自测空数组或数组长度为1输入为最大值、最小值、负数目标值不存在于数组中的情况有重复元素的情况字符串为空字符串或全为空格的情况这些边界数据通常会占10%-20%的测试用例。宁可多花30秒做自测也不要因为一个边界问题被判挂。6.3 输入输出格式的坑有些笔试平台要求极其严苛的输出格式比如每行末尾要不要空格、数组是否用逗号分隔、字符串是否需要加引号。建议做任何题目之前先看清它给出的输入输出示例。还有一个很容易被忽视的细节多组输入的处理。有些题目会循环读取多个测试用例如果你只处理一组就return了后面全是0分。读题时看到“输入包含多行”“每组数据占一行”这样的描述时一定要写成循环处理的结构。6.4 不要在一个题上死磕笔试最忌“完美主义”。一道题卡了20分钟最好的选择不是继续耗下去而是先跳过去做后面的题等把所有拿得准的题都做完了再回头啃硬骨头。确保自己能把该拿的分都拿到再考虑挑战难度分这是笔试的底线思维。7. 笔试之外从真题到Offer的最后一公里笔试通过之后真正的筛选才刚刚开始。根据我对字节客户端团队面试风格的了解过了笔试之后面试官通常会围绕以下几个方面展开7.1 算法面试的追问会更深笔试中你AC的那道题面试官大概率会在面试中再问你一次但会“加码”。比如笔试考了链表反转面试可能问如果每K个节点一组反转怎么做如果链表有环怎么处理如果只允许遍历一次呢所以在备考时每做完一道题都尝试追问自己两三个变种问题直到你能从“背模板”进化到“理解原理”。7.2 客户端基础知识的储备要同步进行笔试只是敲门砖面试中一定会问到Android的四大组件和启动模式Activity的启动流程Handler机制和Looper事件分发机制自定义View的measure/layout/drawRecyclerView的缓存复用机制性能优化启动优化、布局优化、内存优化、卡顿优化在准备笔试的同时建议每天抽出时间看客户端八股文双线并行。因为笔试到面试之间的间隔通常很短如果等笔试过了才开始准备面试基础知识时间会非常紧张。7.3 项目经历是区分度的来源如果简历上写过一个有亮点的客户端项目面试官深挖项目的时间会占掉一半以上。项目中涉及的技术点——比如图片加载优化、列表卡顿治理、网络请求封装、崩溃治理——每一个点都可以往下追问三层。这也是我要特别提醒你的不要在笔试阶段把全部精力耗在算法上而忽略项目梳理。笔试只是入场券项目才是你和面试官之间真正的谈资。8. 以2017年为镜这些年客户端笔试的变与不变字节2017年的这套笔试题放在今天依然有很强的参考价值因为它的内核是稳定的。不变的是算法和数据结构依然是笔试的绝对主体操作系统、网络等计算机基础依然是必考区时间紧凑、题量大的笔试节奏没有变高分的关键在于正确率速度代码规范性变化的是客户端领域的新技术如Flutter、Compose、协程等开始进入面试考察范围但笔试中占比不高场景题的包装更加贴近真实业务对工程素养和创新方案的要求更高了所以我的结论是这份2017年的笔试题依然值得你花时间研究、动手做一遍。但不要只盯着题目本身的答案要透过题目看到出题人想考察的底层能力再把这些能力迁移到新的题目和真实的工程问题中。最后分享一下我个人在帮助身边人准备这类笔试时经常说的一句话刷题不是目的帮你建立“把复杂问题拆解成已知模型”的能力才是目的。字节也好其他大厂也好出题人未必在意你是否见过原题他们在意的是你是否具备面对新问题时快速定位、拆解、实现和验证的能力。这套能力一旦建立起来你就不是“会做这道题的人”而是“能解决这类问题的人”。祝准备笔试的各位好运咱们岸上见。