在线测试:该测试由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