📜  谷歌面试体验(校外)

📅  最后修改于: 2022-05-13 01:58:27.631000             🧑  作者: Mango

谷歌面试体验(校外)

LinkedIn 简历过滤:我收到了一封来自 Google 招聘人员的邮件,询问我的简历。几天后,他打电话给我询问一些细节。他开始询问我的个人资料、我对编码的偏好等。他还问我当时是否有任何工作机会。后来,他开始问我一般的技术问题,例如:

  1. 排序/搜索算法的运行时复杂度
  2. 散列和树条件复杂性
  3. 平衡树示例
  4. 不用计算器估计 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> versionMap;

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:利用队列获取结果字符串。