上周五刚刚完成谷歌R1的两轮面试,今天收到 R2 通知,趁记忆还新鲜,把这次 Google面经 整理出来分享给大家。
Google 的 Coding 面试用的是完全纯文本编辑器,没有任何运行或调试工具。面试官通常会要求你在没有执行环境的情况下做 dry run,也就是逐行推演代码的行为、指针的移动方式,以及数据结构在每一步的变化。这一点和其他公司差别很大,建议提前在纸上专门练习这类推导,不然面试时会很不适应。
Google第一轮VO
Coding:题目是设计一个测试自动化框架的关键组件,用于验证数据随时间变化的系统行为(如电商网站的商品价格变化)。测试代理需要访问一个”真实数据源”(Source of Truth, SoT),这是一个按时间戳排序的记录列表,每条记录包含在特定时间段内有效的信息(如价格)。需要实现方法,接收已排序的查询时间戳列表,高效返回每个时间戳对应的正确记录。
题目可以简单理解为给两个按照时间排序的列表SoT和queries, 对于每一个query, 在SoT列表中查找大于等于他timestamp的最小元素并返回。
解题思路:这题根据SoT和queries的长度可以有两种方法做 设q是queries的长度, p是SoT的长度 1. 如果p >> q, 那么我们在SoT中进行二分, 时间复杂度是O(qlogp) 2. 否则用双指针做, 时间复杂度是O(p + q)
Google第二轮VO
Coding:You’re given array of integers. Please find the length of the longest contiguous non-decreasing subarray。
解题思路:这道题是原题数组是空的就直接返回0,只有一个数字就返回1。接着用两个变量来记录状态,max_len 用来保存我找到的长度,cur_len 用来记录当前正在数的这一段有多长。从第二个数字开始,挨个比较每个数字和它前面的那个——如果当前数字没有变小,就让 cur_len 加1,然后看看是不是要更新 max_len;如果数字变小了,就重新开始数,把 cur_len 设回1。这样一路数到后面,max_len 里存的就是整个数组里最长的那一段连续不下降数字的长度了。
Follow up:Extension part: Now, you can choose a single point on the original array and change the number of that point to any value you want.
备考建议
关于题型准备: 时间序列类、双指针、二分查找是 Google 高频考察方向,这两轮都有体现。建议把这几类题型专项刷透,尤其要练习在没有 IDE 的情况下手写代码。
关于 dry run: 用纸笔模拟,选一个包含边界情况的例子,逐行走一遍代码,是最有效的练习方式。
关于 follow-up: 不要等面试官提,主动说”如果数据规模很大/有新的约束,我会考虑……”,这样的主动性在 Google 评分里非常加分。
如果你近期拿到了 Google SDE 的面试邀请,Interview Aid 提供针对 Google R1/R2/Onsite 全流程的专项辅助,Senior 和 Staff 级别的 System Design 也有专项服务,欢迎提前联系我们了解。