微软面试经历 |第 124 组(IDC 校园内)
微软IDC面试经历
在线评估
平台:CoCubes
格式:3道编码问题
时间:90分钟
Q1) 完成以下函数:
int findMax(Treenode arr[], int size_of_array){
// code goes here
}
其中 Treenode 是一个定义为的结构:
struct Treenode{
int feet;
int inches;
};
该函数应计算所有数组元素的 (12*feet+inches) 并返回最大值。
Q2) 完成以下函数:
Treenode* findInorderSuccessor( Treenode * root ,Treenode* node){
// code goes here
}
Where Treenode is a structure defined as:
struct Treenode{
Treenode* left;
Treenode* right;
Int data;
Treenode*parent;
};
该函数应返回指向函数中提供的“节点”的中序后继的指针。如果不存在,则返回 NULL。
Q3) 完成以下函数:
Node * findIntersection( Node* head1, Node*head2){
// code goes here
}
Where node is the structure of a linked list node
defined as:
struct Node{
int data;
Node *next;
};
将头指针返回到两个链表的交点。有人提到不要使用额外的空间,并且实现应该是递归的。
团体飞行:
40名候选人入围小组飞轮。
候选人大致分为4-5人一组,每组由一名导师负责。我们被问到一个问题,我们被要求用任何高级语言编写函数解决方案(不允许使用 Ruby、 PHP、 Python等脚本语言)。我们被分配最多 45 分钟。
问题:给定两个长度相同的字符数组(不是字符串),并将它们的长度作为函数的参数。我们必须找出第一个字符串是否是另一个字符串的旋转。我们不应该使用任何额外的空间。时间复杂度可能是二次的。
导师不断地来到每个人面前。他首先问我在想什么。我用一个例子告诉他这个方法。然后我在项目符号中编写了代码、示例测试用例和基本方法部分。不过,他们只需要代码。
第1轮:
大约 50% 的候选人在小组飞行后被选中。
我收到了两个编码问题:
问题 1) 给定一棵树,打印树的所有边,满足以下两个条件:
只打印右孩子为 NULL 的节点,
该节点是叶节点。
我给出了递归的方法。后来我在解释它在某些情况下失败时意识到。我要求一段时间来纠正它。我终于给了他一个代码,他似乎对此很好。
问题2)给定一个矩阵,以之字形方式遍历矩阵:
Ex:
1 2 3 4
5 6 7 8
9 1 1 2
Traversal: 1 2 5 9 6 3 4 7 1 1 8 2
我给出了一种时间复杂度 O(NXM) 的方法。他问我是否可以在更小的时间复杂度内做到这一点。我可能会使用额外的空间。我想不出任何非常具体的东西。我的回合结束了。
第 2 轮:
面试官问我组飞得怎么样。然后他向我解释了我有一个固定的 NXM 二维空间的情况。我得到了一组随机数(不在运行中)。我必须找到一种有效的方法来存储它们,这样我才能以最小的时间复杂度检索每个元素。
通过命中和试验,我们达到了一种方法,我可以以这样一种方式存储数字,即每一行都被排序,并且跨行的顺序也在增加。现在我们可以对第一列应用二分查找来找到合适的行,然后二分查找得到的行中的数字。时间复杂度:logM+logN。他让我写代码。第二轮就是这样。
面试官非常乐于助人,很愉快。
第三轮:(决赛)
15分钟后我被要求参加第3轮。它应该是人力资源,但主要是技术性的。我被问及我所有的项目以及我在其中的角色。
然后他给了我一个问题,说我们只讨论方法,不需要编码。
该问题类似于以下 geeksforgeeks 问题:https://www.geeksforgeeks.org/divide-and-conquer-set-7-the-skyline-problem/
我有点挣扎,但他帮助了我。然后我们讨论了最终的解决方案和方法。
由于是晚上 8 点 30 分,我已经完成了一天的工作。一轮结束后,有人告诉我,我已经完成了所有轮次,不必再来。