微软面试经历 |设置 108(校内)
第一轮:能力
第 2 轮: 2 道数据结构题
第三轮:团体飞轮
- 在二叉树中找到两个节点的最小共同祖先。
确定当前根值是否与键值之一匹配。如果是,则返回此根。否则,该过程将针对左子树和右子树重复。左子树中有一个键,右子树中有另一个键的节点就是 LCA。如果两个键都位于左子树中,则其值与其中一个键值匹配的第一个节点是 LCA。同样对于右子树。时间复杂度为 O(n)。面试官要求优化。我为 BST 提出了一种更好的方法。 - 给定两个排序数组(具有重复元素)从两个数组中找到第 k 个最小数。
- 为每个数组维护一个索引,两者都初始化为各自数组的第一个元素。循环 k 次,在每次迭代中找到当前索引中的最小元素,并增加包含最小值的数组的索引。如果元素相等,则增加两个索引。时间复杂度为 O(k)。
第四轮:
- 给定 BST 中的一个节点,删除它。父链接不是节点结构的一部分。
如果该节点是叶节点,则删除该节点。
如果节点有一个子节点,则将节点的值替换为子节点的值并递归删除该子节点。
如果节点有两个子节点,找到中序后继,将当前节点的值替换为中序后继的值,递归删除中序后继。
时间复杂度为 O(h)。面试官建议对一个孩子的情况进行可能的优化,一个孩子不需要递归删除。我们只需要将其左右子指针复制到我们要删除的节点。
相关文章:GeeksforGeeks 链接 - 谜题 - 有九枚硬币,其中一枚有缺陷(重量与其他硬币不同)。找到最大迭代次数以找到有缺陷的迭代。
我建议采用分而治之的方法,最多迭代 5 次。
第五轮:
- 项目讨论
- 一个程序在系统中无限循环运行。如果我们在这个无限循环执行时尝试运行另一个好的程序,那么好的程序会运行吗?
我回答说程序会运行,但是CPU使用率会降低。
- 编写代码以在 C 中实现 strtok()函数。
- 维护一个索引来表示下一个标记的开始,初始化为0。线性搜索字符串,如果找到匹配的模式,则将开始索引的子字符串存储到字符串数组中模式的前一个位置并更新开始下一个令牌的索引。时间复杂度为 O(n)。
面试官想知道为什么我使用 malloc() 而不是静态分配。
微软的所有练习题!