📜  微软实习面试经验

📅  最后修改于: 2021-11-17 09:57:31             🧑  作者: Mango

最近微软来我们的校园实习。他们进行了一轮编码,随后进行了 3 次面试(2 次技术面试和 1 次人力资源面试)。

在线测试:在mettl上进行,我们有90分钟的时间来解决3个问题。每个人的问题都被洗牌了,但相当容易。

  1. 给定一个字符串,我们需要返回一个字符串,其中每个字符都应该增加 3 个单位。

    例如。

    adz -> dgc
    

    a变成d,d变成g,z变成c。这里唯一的技巧是我们只需要完成给定的函数,他们将字符串作为字符指针传递,因此您需要了解如何遍历表示为字符指针的字符串。

  2. 将中缀表达式转换为后缀表达式。

  3. 给定一个 num1+num2=num3 形式的字符串,其中一个是 X,我们需要找到 X 的值。

    例如。

    Input : 5+X=7 
    Output: X= 2
    Input : 7+2=X
    Output: X=9
    

    所以这基本上是一个基于实现的问题,我们只需要找出其中一个是 X 并相应地找到答案。

48名学生被选为面试。

第 1 轮:这一轮我被问到 3 个问题。问题很简单。

  1. 查找堆栈中任意点的最大和最小元素。我被要求编码。我试图通过在编写代码时告诉他我的方法来保持采访的互动性。我被要求做一些试运行,他似乎对我的方法很满意。
  2. 反转字符串。我们讨论了大约20分钟的堆栈问题,我告诉他我将使用堆栈来反转它,他没有要求我优化它。
  3. 镜像给定的二叉树。我首先告诉他我的方法我们将使用后序遍历,然后他让我编写代码。

我回答了所有问题,所以我非常有信心被选中参加下一轮。

第 2 轮:在这一轮中我只被问到了 2 个问题。

  1. 求一棵树的直径(树中最长路径上的节点数)。我以前见过这个问题并且知道解决方案,所以我只是告诉他我的方法,我们在继续下一个问题之前对样本输入做了一些试运行。
  2. 给定一个数字 N,我们需要通过执行最少的操作次数将 N 转换为 1。允许的操作是:
    • 从一个数中减去 1。
    • 将数字除以 2。
    • 将数字除以 3。

        例如。

      Input: 10 
      Output: 3
      10->9->3->1
      

      所以一开始,我试图通过采取不同的案例来概括解决方案。面试官让我改变我的方法,我想到了动态规划方法。

      C++
      #include 
      using namespace std;
        
      int main()
      {
          int n = 10;
            
          int dp[n + 1];
          dp[1] = 0;
          dp[2] = 1;
          dp[3] = 1;
          for(int i = 4; i <= n; i++)
          {
              dp[i] = dp[i - 1] + 1;
              if(i % 2 == 0) dp[i] = min(dp[i], 1 + dp[i / 2]);
              if(i % 3 == 0) dp[i] = min(dp[i], 1 + dp[i / 3]);
          }
          cout<


      输出:

      3

第 3 轮(人力资源):所以它从诸如告诉我关于你自己的问题开始。我为这个问题做好了准备,我一直专注于我的编码技能。对我来说,这是人力资源和技术回合的混合。

所以,他问了我关于双向链表的问题。给定一个指向双向链表随机节点的指针。删除节点。

我们讨论了所有涉及的边缘情况,他只是让我在心里编码并告诉他每一行。他似乎很满意。然后他问我为什么想在微软工作。随后是关于 OOPS 和哈希的问题。

他问我在现实生活中散列的实现是什么,以及散列是如何在内部实现的。我能够回答这个问题,但我不知道技术术语。最后,他问我有没有什么问题要问他。永远不要回答这个问题,因为这表明你对了解这家公司不感兴趣。

判决 – 选择