📜  Nutanix 2018 年面试体验

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

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 分钟)

结果:未选择