📜  微软IDC专访|第 35 组(校内实习)

📅  最后修改于: 2021-11-15 08:24:59             🧑  作者: Mango

在线测试:该测试由cocubes.com组织,必须在一个小时内完成。

有两个编码问题:

1.有一个链表,其节点定义如下

struct node
    {
        int x,y;
        node* next;
    };

我们必须实现一个取链表头的函数,如果任意三个连续点位于同一水平或垂直线上,我们必须删除中间节点。链表要么是空的,要么至少包含两个节点。函数原型是:

void remove(node* head)
    {

    }

例子:

Input: (1,2)->(2,3)->(2,4),(2,5)->(3,4)
Output: (1->2)->(2,3)->(2,5)->(3,4)

2. 给定一个已排序的数组,将其转换为高度平衡的二叉搜索树。高度平衡树是其中每个节点的左右子树的高度差最多为1的树。二叉树的节点为:

struct node
    {
        int data;
        node* left;
        node* right;
    };

要实现的函数是:

node* binary_tree(int* ar, int len)
    {

    }

面试:
有3轮面试,我们在纸上写代码。

第1轮:
有两个问题:
1. 给定一个字符串,删除所有连续出现的 ‘a’ 和任何出现的 ‘b’。
示例:输入:“aacbccdbsssaba”,然后输出:“acccdsssa”

2、如果我们要在文本编辑器中实现插入和删除功能,应该使用什么数据结构?函数应该尽可能快。

第二轮:
问题1:给定一个字符串,在该字符串两个位置,洗牌的字符串,也就是移动给子前面。例子:
输入:abcdefgh, 4,6
输出:defabcgh
这必须以 O(n) 时间复杂度就地完成。

问题2:如何在C++中实现字典数据结构?我们应该使用什么样的哈希函数?如何管理碰撞?

问题 3:您将如何自己在 C++ 中实现矢量数据结构?访问时间复杂度是多少?你怎么能做到O(1)?如何调整结构的大小?

第 3 轮:
问题 1:给定一个 k-ary 树,如何逐层打印元素?

问题 2:给定一个单向链表和一个数字“n”,编写代码来反转链表的每一个“n”个元素。例子:
输入:1->2->3->4->5->6,n=3
输出:3->2->1->6->5->4

微软的所有练习题!