Nutanix 2018 年面试体验
第 1 轮:编码轮 [Hackerrank] – 60 分钟 – 2 个问题
Q1:给定一个班级的一组共同朋友,你能把班级分成两组,这样:
对于一个小组中的所有学生,每个学生都是其他学生的朋友?
注意: Friendship 是不可传递的,即如果A 和B 是朋友,B 和C 是朋友,并不意味着A 和C 是朋友。
一个只有一个学生的小组本身就是一个有效的小组。
输入:
第一行输入将包含 t:测试用例数
每个测试用例的第一行将包含两个输入 N、M。
N 个节点和 M 个关系。
接下来的 M 行包含两个节点 A、B。
AB 表示 A 和 B 是朋友。
输出:如果可以,则为 YES,如果无法进行此类划分,则为 NO。
例子:
1
6 7
1 2
2 3
3 1
2 4
4 5
5 6
6 4
输出:TRUE
1-2-3 是全连接子图。
4-5-6 是全连接子图。
跟进:GeeksForGeeks
Q2:给定一张大小为 a*b [长*宽] 的地毯和一个大小为 c*d 的盒子,必须以最少的移动次数将地毯放入盒子中。一个动作是将地毯按长度或宽度对折。
一个人甚至可以将地毯任意旋转 90 度,不会被算作一次移动。
例子:
盒子 = 6 * 10
地毯 = 8 * 12
输出:移动数 = 1
按宽度折叠地毯,12/2
所以现在地毯是 6*8 的,可以很好地贴合。
方法:
尝试考虑比较较小的数字和较大的数字。并将较大的数字除以 2,并根据需要旋转多次。
结果:这一轮的截止点至少通过了 Q2 的 7/8 个测试用例。没有人能够通过 Q1 的所有测试用例。
我们五个人进入了下一轮。
第 2 轮:调试轮 [笔和纸] – 50 分钟
提供了中缀到后缀转换的 AC 代码,90-100 行代码。
代码基本布局:
struct stack_node {
// using linked-list struct for stack nodes
// this one seemed fine, no bugs
// needed to be taken care of
push() // insert at the end approach used here
// changed the whole function to use
// insert at the beginning approach
// even malloc wasn’t used for new nodes
pop() // deletion from the end
// used deletion from front
// free wasn’t used in deletion
front() // used to get value of top of node
// no issues here
bool precedence() // had some issues in parameter
// checks, swapped the parameters
};
main()
{
struct node* head; // isn’t null initialised
// make sure not to use nullptr, as it’s C
int i = 0, j = 0;
for (i = 0; i < strlen(infixStr); i++) {
if (infixStr[i] >= ‘A’ && infixStr <= ‘Z’)
postfix[j] = infixStr[i]; // j++ needed here
do {
char stackTop = front(head);
// no check was done for head == null,
// either here or in front ()
pop(head);
// didn’t needed pop at the very first
// peek of stack top
if (precedence(infixStr[i], stackTop)) {
push(infixStr[i], head);
break;
}
else {
postfix[j] = infixStr[i];
// many things need to be corrected here
// pop ( ) needs to be called here
// the postfix j++ bug again
// postfix [j++] = stackTop, rather than infixStr
}
} while (1);
printf(“% s”, postFix); // missed adding a ‘\0’ terminator here
}
}
// This is just a gist of the actual code
结果:
5 人中有 3 人进入下一轮。
第 3 轮:面试轮 [面对面] – 45 分钟
候选人 1:
从简历开始。
以前工作的讨论[在M.Tech之前有1年的经验]。
来回讨论多处理器或多线程面临的挑战。
解释了 malloc 启动系统锁和其他一些信号试图获取锁的错误,这是一种竞争条件。以及如何找到问题根源和异步任务的核心方法。
面试官似乎很满意。
这一轮只讨论一个问题。
给定一棵二叉树和一个数 X,求:
距离根 X 的所有节点
与叶节点距离 X 的所有节点
例子:
图形:
1
1 1
1 1 1 1
1 1 0 0 0 0 0 0
X = 2。
从图形上看,该图如下所示:
输出:
距根 2 处的节点:4 [DEFG]
距叶子 2 处的节点:2 [A 和 B]
跟进:
问题的 A 部分很简单。
对于 B 部分:
花时间解释解决方案的不同方法(从指数开始,然后是 O(n^2))。
20-25分钟已经过去了。
然后尝试定义用于创建图形的结构并使用 BFS [邻接列表结构] 的属性。
面试官只在那里拦住了我,并建议考虑一个不同的解决方案,我们甚至不想创建一棵树。
由于我们将输入作为完整的二叉树 [ 作为 0 和 1 ]
于是制定了一个寻找节点的公式。
从中制定了一个简单的解决方案
(如果叶子在 input[i][j] 位置,那么它的结果节点将在
输入 [i] [j / (2^X)]。
现在,棘手的部分来了:
面试官问我得到的解决方案是否已经包含节点“A”,然后设计一种技术,这样我们就不会一次又一次地看到 A。
这是一个很小但有影响力的性能改进。
经过几分钟的讨论,给出了一个我们不需要看的方法
输入 [i] [ j – 2^K] 个节点,因为它们会给出相同的答案(定义了一个从右到左、从下到上的方式存储叶子的结构,在每行中保持 0 的计数)。
面试官让我把它编码,但我没有太多时间去做(也许他正在使用秒表或其他东西)。写了部分代码,时间到了。
结果:选择
候选人 2:
从简单的自我介绍开始。
给出了相同的问题(二叉树)。我应该编写完整的代码,包括接受输入。但我问是否可以使用伪代码,他同意了。我为 (a) 部分做了一个简单的 BFS,为 (b) 部分做了一个 DFS,一个 O(n) 的解决方案,他对此很满意。完成代码后要求我进行优化。
后来在我的简历上讨论了其他一些问题,但似乎只是因为我提前完成了代码。询问我在 Nutanix 的学习期望,以及我在做我在简历中提到的项目之一时遇到的问题。
结果:选择
候选人 3:
从一个简短的介绍开始,并询问了我的爱好。
同样的问题也给了我。我被要求不要编写伪代码,并被要求用Python编写代码。我能够解决第一个问题并编写代码。我还解决了第二个问题,但在编写代码时遇到了困难。大约 45-50 分钟后,面试官叫住了我。
后来有人问我几个关于我的简历和以前的实习的问题(2-3 分钟)
结果:未选择