谷歌面试体验(校外)
LinkedIn 简历过滤:我收到了一封来自 Google 招聘人员的邮件,询问我的简历。几天后,他打电话给我询问一些细节。他开始询问我的个人资料、我对编码的偏好等。他还问我当时是否有任何工作机会。后来,他开始问我一般的技术问题,例如:
- 排序/搜索算法的运行时复杂度
- 散列和树条件复杂性
- 平衡树示例
- 不用计算器估计 2^24
环聊电话会议:
面试官跟我打招呼,问了我一个老生常谈的问题,告诉我你自己。
主要问题是:给定候选人参加选举,您必须创建一个包含以下函数的界面:
1. voteCandidate(候选人ID);
2.getTopK(k);
第一个函数用于对由候选ID 表示的候选人投票。
第二个函数用于在选举过程中随时查找前 K 名候选人。
解决方案:使用地图存储每个候选人的票数和最大堆以检索前 k 个元素。时间复杂度 O(n + klogn)。
有关第二个函数,请参阅此链接:
电话面试后,我被邀请进行现场面试。我有4轮。
第1轮:
问:一个图有 N 个顶点,编号从 1 到 N。我们有两个列表。一个列表 M 由顶点之间的边组成。另一个列表 K 由受限路径组成。我们必须从 M 中一一添加边,并检查特定边的添加是否导致 K 中给定的受限边之间的路径。如果它创建了路径,我们必须丢弃该边。
示例:N = 4; K = {(1, 4)}; M = {(1, 2), (2, 3), (3, 4)}。在这里,添加边 (3, 4) 将在 1 和 4 之间创建一条路径。因此我们丢弃边 (3, 4)
A:使用连接的组件。
第 2 轮:
Q1。我们有一个名为 Logger 的接口,其中包含两个函数:
startReq(req Id, 开始时间)
finishReq(req Id, 结束时间)
Logger 获取大量请求的起始时间。这些请求被发送到 startReq函数。请求完成后,我们调用函数finishReq。我们应该能够打印包含按开始时间排序的已完成请求的输出。
Request ID | Start Time | End Time |
A | 0 | 25 |
B | 4 | 18 |
C | 2 | 20 |
D | 7 | 10 |
我们需要输出为:
一个 0 25
C 2 20
乙 4 18
D 7 10
A:使用map来存储请求结束时间。使用队列来保持请求的排序。
Q2。给定数组的各种子序列,打印整个数组:
示例:[1, 3, 5], [1, 3, 9], [9, 5]
数组:[1, 3, 9, 5]
A:使用 DAG 来表示子序列。执行拓扑排序得到数组。
第三轮:
Q1:实现版本控制映射系统,对数据的版本进行快照。实现以下功能:
put(key, value) -> 将值再次作为最新版本地图的键
get(key) -> 获取最新版本数据的键值
snapshot() -> 拍摄快照并增加版本
getValVersion(version id, key) -> 返回特定版本的键值
A:我使用了像这样的向量映射 map
Q2:给定一个整数流,一个值 k 和一个值 w,考虑窗口 w 中的整数,并从窗口 w 中剔除较大的 k 和较小的 k 个元素。从剩余的元素中,计算平均值。
A:利用最小和最大堆。
第四轮:
Q1:字符串A是否可以转换为字符串B
echo {1, 2, 3}{a, b} 转换为
1a、1b、2a、2b、3a、3b
PS:可以有任意数量的花括号。
A:利用队列获取结果字符串。