📜  Fourkites 面试经历 |暑期实习

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

Fourkites 面试经历 |暑期实习

这是校园招聘,所以水平和难度可能会根据你的大学而有所不同

第 1 轮:Hackerearth 上的编码轮

大约 20 个关于能力和 C/ Java代码输出的 MCQ 问题和 2 个编码问题。我能够通过第一个问题的所有测试用例,而第二个问题只有 2/3 的测试用例。我是从这一轮中选出的三个人中的一个。我现在不记得这个问题了。

第 2 轮:技术第 1 轮
我们首先在简历上讨论了我的项目,他让我详细说明我的一个 Node.js 项目,这是一个后端支持 Node.js + mongoose的博客网站。我被问到为什么我使用mongoose而不是一些关系数据库,这是因为我当时正在学习,而教练正在使用mongoose,所以我也使用了相同的数据库。然后他问了我一个基于SQL的问题

问题:给定一个表,提取其奇数列
我试过了,但因为我没有答案,所以我接受了我不知道答案
然后我们继续一个编程问题
问题1:给定两个链表,如何将它们合并为一个排序链表。

我的解决方案:
我首先通过将第一个链表的最后一个节点连接到
第二个链表的第一个节点并使用冒泡排序对它们进行排序

他要求我提高解决方案的复杂性。
我问他记忆力有没有限制,他说没有。所以我再次加入了他们
在合并列表上使用计数排序

现在他说假设内存有限制。
我告诉他我知道合并排序将有助于首先对它们进行排序然后合并但是
我真的不知道如何在链表上应用合并排序,我只知道数组和列表。
他询问了合并排序的时间复杂度,并假设它是一个排序列表现在合并它们。
我使用了两个指向列表开头的指针,并一个一个地合并它们的元素
在较低的节点上一一移动指针,直到所有节点都未添加到新列表中。
这是代码

def merge(list1, list2):
    """
    list1, list2 are the two sorted lists
    Function returns the merged list
    """"
    ptr1 = 0
    ptr2 = 0
    finalList = []
  
    # While any pointer reaches the end of the list
    while ptr1 < len(list1) and ptr2 < len(list2): 
        # If list2 has the smaller element add it and increase the pointer to the next position 
        if list1[ptr1]>list2[ptr2]:
            finalList.appennd(list2[ptr2])
            ptr2 += 1
        # Otherwise add element form list1 and increase the pointer to the next position
        else:
            finalList.append(list1[ptr1])
            ptr1 += 1
  
    # Adding the elements left in list1 or list2
    if ptr1 == len(list1):
        while ptr2 
I was asked the time complexity of the program, I replied

O(min(n, m))

(其中 n 和 m 是列表的长度)。他纠正并告诉我

O(n+m)

第 3 轮:技术第 2 轮
它从一个基本的介绍和一个关于数据结构的问题开始。

Question: You have

n

日志,您可以一次加入其中两个,但需要付费
等于它们的长度之和。您必须以最低成本将所有日志连接到单个日志

我的解决方案:
我花了一些时间考虑解决方案,我想如果我继续加入两个最小的
它应该给出最低的成本,所以我要求一个例子来更好地理解这个问题。

Example:
5 logs of size 2 3 4 5 7. Answer: 47
Solution:
2+3 = 5, logs = 4, 5, 5, 7 cost = 5
4+5 = 8, logs = 5, 7, 9 cost = 5+9
5+7 = 9, logs = 9, 12 cost = 5+9+12
9+12 = 21, logs = 21 cost = 5+9+12+21 = 47

I could have sorted the list but after each join, I will have to insert a new log into the list
that can take

O(n)

对于每个日志,因此制定解决方案

O(n^2)

.
所以我每次都用minheap来计算最小日志。顶部节点已经是最小值
并且在删除它之后,2ed 最小值来到了根。
堆中的插入时间是

O(log(n))

这比

O(n)

.
这是代码:

import heapq
def cost(n, logs):
    """
    n is the number of logs
    logs is the list containing length of logs
    Returns the minimum cost of joining all the logs
    """
      
    # Createing a min-heap using length of logs
    heap = []
    for i in range(n):
        heap.heappush(logs[i])
  
    cost = 0
    # Loop until one log is left
    while len(heap)>1:
        # Log with minimum value
        log1 = heap[0]
        # Removing the minimum / root value
        heap.heappop()
  
        # Similarly second minimum log will be the minimum after the previous removal
        log2 = heap[0]
        heap.heappop()
          
        # Length of new log which is equal to the cost of operation
        newlog = log1 + log2
        cost += newlog
  
        # Inserting the new log back in the heap
        heap.heapush(newlog)
  
    # Cost stores the total cost for this operation
    return cost
I was asked the total time complexity of this operation which is

O(nlog(n))

第 4 轮:技术第 3 轮

受访者首先问我关于我的项目,然后问为什么
受访者:为什么要在SDE实习
我:自从我开始竞争性编程以来,我就喜欢解决问题,我喜欢做开发,因此我发现软件开发适合我。
受访者:你最喜欢的数据结构是什么?
我: Tree,然后我提出了关于使用 Trie 数据结构生成测试完成的项目,我们讨论了如何在使用 Trie 处理大量数据时处理大数据。我建议修剪树,因为叶子端的大多数节点都是 NULL 指针,这将有助于节省大量内存空间。
这是一个非常短的采访,持续了 30-40 分钟。

最后,我是被选为 Fourkites 的 SDE 实习生的 2 人之一