Flipkart 面试体验 |第 32 组(用于 SDE-1)
Flipkart 最近访问了我的大学以招募 SDE-1。在这里分享一下我的面试经历。
第一轮:关于 HackerRank 的 2 道编码问题(90 分钟)。
1.给定一些关于计算机系统的数据(如 RAM、ROM、处理器速度、电池等)。您需要根据 (i) RAM (ii) 如果 RAM 相同则 ROM (iii) 如果 ROM 相同则处理器速度等打印前 k 台计算机。
约束:k <= 100
(计算机系统数量)n <= 1000000
解决方案:任何 O(nlogn) 排序都可以。但我所做的是实现冒泡排序并运行它的 k-passes。然后打印数组的最后 k 个元素。由于 k <= 100,它花费了 O(nk) 时间。
2.有一个大小为 n*n 的迷宫。汤姆坐在 (0,0) 处。 Jerry 坐在另一个单元格中(输入 Jerry 的位置)。然后有 k 块奶酪放在 k 个不同的单元格中(k <= 10)。有些细胞被阻塞,而有些则没有。 Tom 可以在任何时间点移动到 4 个单元格(左、右、上、下一个位置)。汤姆必须收集所有的奶酪碎片,然后才能到达杰瑞的牢房。您需要打印最小编号。这样做所需的步骤。
解决方案:动态规划。
第二轮:约1小时(面对面)
1.给定单链表的变体,其中每个节点可以有 2 个指针:next 和 down。您需要将列表展平为一个单链表,其中每个节点只有一个 next 指针。这需要就地完成,因此每个节点的向下指针都应设置为空。
例子:
1 -> 2 -> 3 -> 4
| |
V V
7 -> 8 10 -> 11
|
V
14 -> 15 -> 16
|
V
20 -> 21
Output:
1 -> 7 -> 14 -> 15 -> 20 -> 21 -> 16 -> 8 -> 2 -> 3 -> 10 -> 11 -> 4
解决方案:我首先告诉他使用堆栈进行迭代。他说太复杂了。然后我告诉他使用递归,大约 2 行代码。他让我编写代码并且非常满意。请记住涵盖所有基本案例和角落案例。
2.1。你得到一个字符串。打印第一个非重复字符。
解决方法:我问他字符编码。他说ASCII。我告诉他取一个大小为 128 的整数数组“count”,每个元素都设置为 0。扫描字符串,对每个字符'c',执行 count[(int)c]++。然后再次扫描字符串,当你找到 count[(int)c] == 1 的第一个字符时,打印它并断开。如果没有找到 count[(int)c] == 1 的此类字符,则表示没有答案(字符串中没有非重复字符)。
2.2.如果字符串很长怎么办。做两遍是昂贵的。
解决方案:我将使用具有两个元素计数和索引的结构数组。当我们做 count[(int)c]++ 时,我们还将设置 index[(int)c] = index of c in the 字符串。现在不是第二次扫描字符串,而是扫描结构数组(对于 i = 0 到 127)并保留一个临时变量 tempIndex = MAX_INTEGER。当你找到 count[i] == 1 时,检查 index[i] < tempIndex。如果为真,则将 tempIndex 更新为 index[i]。最后在 index = tempIndex 处打印字符中的字符串。如果 tempIndex == MAX_INTEGER,则表示没有答案(字符串中没有非重复字符)。
2.3.你没有得到一个字符串。您会收到一些类型 1 和类型 2 的查询。
类型 1:将字符(作为输入)附加到字符串的末尾。该字符串最初为空。
类型 2:打印到目前为止形成的字符串中的第一个非重复字符。
解决方案:继续为每个类型 1 查询构造字符串。对于非可变字符串上的每个类型 1 查询,这将花费 O(n) 时间。如果我们使用可变数据类型,例如Java中的 StringBuilder,则每个 Type 1 查询都需要 O(1) 时间。
对于类型 2 查询,运行 2.2(上)的算法。对于每个类型 2 查询,这将花费 O(n) 时间。如果有 q 个类型 2 查询,则需要 O(nq) 时间。
2.4.在恒定时间内求解 2.3(上),即对于每个查询(类型 1 或类型 2)都需要恒定时间。所以整体复杂度应该是 O(q),其中 q = no。类型 1 查询 + 没有。类型 2 查询。
解决方案:花了很多时间(大约 20 分钟),并尝试了很多东西,然后才得出以下解决方案。
- 使用双向链表构造一个队列(单链表也可以在下面的算法中进行一些修改,但面试官说不要打扰)。
- 使用 Key = 字符和两个值构造一个 hashMap。值 1:布尔 isPresentInQueue,值 2:指向链表中节点的指针。
- 当您收到一个字符(在类型 1 查询中)时,检查该字符是否存在于 hashMap 中。
- 如果不存在,请将其插入。将 isPresentInQueue 设置为 true。将字符插入队列的末尾,并将插入节点的指针(地址)保留在 hashMap 的 Value 2 部分(对于该特定字符)。这将花费 O(1) 时间。
- 如果该字符存在于 hashMap 中并且该字符的 isPresentInQueue 设置为 true,则将 isPresentInQueue 设置为 false。使用 hashMap 的 Value 2 部分中的指针(地址)(对于那个特定的字符),从链表中删除节点。这将花费 O(1) 时间。
- 如果字符存在于 hashMap 中并且 isPresentInQueue 为 false,则忽略该字符并继续前进。这将花费 O(1) 时间。
- 当您收到类型 2 查询时,只需打印链表的前面(头部)。那将是答案。这将花费 O(1) 时间。
每个查询(类型 1 和类型 2)都需要固定时间。因此,总体复杂度为 O(q) 或 O(查询次数)。
3.解释外部归并排序。并尽可能优化它。
解决方案:我说我不知道外部归并排序是什么。但是我知道归并排序是什么,而且我知道外部排序基本上是对一些存在于二级内存中的数据进行排序(因为它太大了,不能完全带入主存中)。所以,他说现在把两者结合起来。我给出了几种算法,第一种是一种简单的方法,我将整个数据分成 k 块,将每块放入内存,对其进行排序,推回二级内存等等。然后我告诉了一些类似于锦标赛树的东西。
4.解释我所知道的所有排序算法的最佳、平均和最坏情况复杂性。它们在哪些情况下效果最好。
解决方案:我告诉他 8 种算法,它们的最佳、平均和最坏情况的复杂性,以及它们有用的场景(对所有这些算法)。相信我,它们中的每一个在某些情况下都是有用的。例如,冒泡排序是解决第一轮编码问题的最佳算法之一。
5.关于我的项目的问题。
6.关于我在大学技术节中组织的一个活动(算法编码竞赛)的问题。
第三轮:由高级招聘经理(通过 Skype)。 1小时左右。
1.关于我的项目的问题。
2.关于我在大学技术节中组织的一个活动(算法编码竞赛)的问题。
3.我最喜欢的网站。我告诉quora。他问我,quora 是如何如此迅速地传递信息的。我告诉他我不知道他们到底在做什么。但是如果我需要如此迅速地传递信息,我可以告诉我该怎么做。然后我给出了一个非常抽象的想法,其中我利用了分布式系统、缓存(基于特定用户和他们的兴趣)等。
4.更多关于一般(但技术)主题的讨论。他告诉我他的工作和团队。问了我的兴趣和愿望。
5. 谜题:你被蒙上眼睛(你看不见)。桌子上有 100 枚硬币。 80个是反面,20个是单挑。您需要将它们分成两组,每组 x 和 y (x+y = 100)。您可以选择任何硬币并翻转它(如果它的尾巴,它会变成头,如果它的头,它会变成尾巴),但你看不到,所以你不知道你在翻转哪个硬币。最后,这两个组应该包含相等数量的头。
解决方案:我花了将近 15-20 分钟才弄明白。分成第一组:20和第二组:80。将第一组的20个硬币全部翻转。
非常感谢 GeeksForGeeks。
一般建议:
- 他们会要求为您的所有解决方案编写语法正确的代码。所以,不要给出非常复杂的解决方案(除非必要)。
- 他们会询问您所有解决方案的时间和空间复杂性。在讲述复杂性之前正确分析解决方案。在递归解决方案的情况下,写出递归关系。
- 不要只在脑海中思考。大声思考。告诉他们你的想法。
- 如果您事先知道问题,请告诉他们您之前已经看到它。他们有兴趣了解
你将如何解决一个新问题,这是你展示你的思考过程的最佳机会。如果您不告诉他们您知道解决方案并胡闹,他们会弄清楚,这对您不利。相信我,他们肯定会发现您事先知道解决方案。