最近微软来我们的校园实习。他们进行了一轮编码,随后进行了 3 次面试(2 次技术面试和 1 次人力资源面试)。
在线测试:在mettl上进行,我们有90分钟的时间来解决3个问题。每个人的问题都被洗牌了,但相当容易。
-
给定一个字符串,我们需要返回一个字符串,其中每个字符都应该增加 3 个单位。
例如。
adz -> dgc
a变成d,d变成g,z变成c。这里唯一的技巧是我们只需要完成给定的函数,他们将字符串作为字符指针传递,因此您需要了解如何遍历表示为字符指针的字符串。
-
将中缀表达式转换为后缀表达式。
-
给定一个 num1+num2=num3 形式的字符串,其中一个是 X,我们需要找到 X 的值。
例如。
Input : 5+X=7 Output: X= 2 Input : 7+2=X Output: X=9
所以这基本上是一个基于实现的问题,我们只需要找出其中一个是 X 并相应地找到答案。
48名学生被选为面试。
第 1 轮:这一轮我被问到 3 个问题。问题很简单。
- 查找堆栈中任意点的最大和最小元素。我被要求编码。我试图通过在编写代码时告诉他我的方法来保持采访的互动性。我被要求做一些试运行,他似乎对我的方法很满意。
- 反转字符串。我们讨论了大约20分钟的堆栈问题,我告诉他我将使用堆栈来反转它,他没有要求我优化它。
- 镜像给定的二叉树。我首先告诉他我的方法我们将使用后序遍历,然后他让我编写代码。
我回答了所有问题,所以我非常有信心被选中参加下一轮。
第 2 轮:在这一轮中我只被问到了 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 和哈希的问题。
他问我在现实生活中散列的实现是什么,以及散列是如何在内部实现的。我能够回答这个问题,但我不知道技术术语。最后,他问我有没有什么问题要问他。永远不要回答这个问题,因为这表明你对了解这家公司不感兴趣。
判决 – 选择