今天阿里实习生招聘在线笔试,我投的职位是研发工程师C/C++。
笔试分两部分,单项选择题和附加题。
做题时忘了记录,现在开始回忆,不保证完整性和正确性。
关于单项选择题
单项选择共20题,40分钟完成。题目涵盖了:
C/C++基础知识
指针
链表
sizeof
类、继承、多态,以及类的实例的内存结构概率与统计
好多这类的题目,,各种排列组合还有什么正态模糊集,,感觉之前都白学了T_T算法
四车,姑且这么称呼吧,类似于八皇后
铺地砖,2*8的地面上铺满1*2的地砖和L型地砖的方法总数数据库
主要考SQL,不会,妥妥地跪数据结构
二叉排序树,红黑树,各种操作的时间复杂度
图论,有向图连通分支STL
stack,实现方式
bitset,作用
vector,容量扩展容错机制
fail fast,graceful degradation,checkpoint,watchdo(watchdog?)什么的,完全不懂。。位操作
关于附加题
说是附加题,但谁敢不做啊!!!
总共3个编程题,80分钟完成。
第一题
给定一块内存,实现分配和释放等操作。类似于malloc、free以及操作系统回收内存等过程。没做完。。
第二题
有点像Qos,负载均衡,按给定需求给任务分配CPU时间什么的,没做,记不清了。
第三题
PRC请求到达顺序和按顺序执行的问题。简单地说,输入一组未排序的序列,要求在输入过程中一旦有子序列满足连续递增便输出,且时间效率最大化。举个栗子,给定序列1 2 4 5 7 3 10 9 6 8
,那么输出是(1) (2) (3 4 5) (6 7) (8 9 10)
,()
表示一次输出。
除了写出程序,还要考虑时间复杂服,鲁棒性,维护性什么的。最后还要求设计单元测试用例。
弱菜我只有这个题做完了。想法是用二叉排序树储存输入序列,每次插入后检查是否存在子连续递增序列,存在便输出。使用栈来实现非递归的二叉树中根序遍历,满足当前节点序号等于上次输出序号+1便输出,直到不满足。遍历过程中若当前节点满足输出条件,那么输出该节点序号后,将该节点的父节点的左子树指向该节点的右子树并销毁该节点,因为使用了栈来实现遍历,所以这个过程很简单。
代码:
#include <iostream>
#include <stack>
using namespace std;
struct Tree
{
int value;
struct Tree *left, *right;
Tree(int x): value(x), left(NULL), right(NULL) {}
};
void outputOrder(Tree* &root, int &last)
{
static stack<Tree*> nodes;
Tree *p = NULL;
if(nodes.empty())
p = root;
else
p = nodes.top()->left;
while(p != NULL || !nodes.empty())
{
while(p != NULL)
{
nodes.push(p);
p = p->left;
}
if(!nodes.empty())
{
p = nodes.top();
nodes.pop();
if(p->value != last + 1)
return;
last = p->value;
cout<<last<<' ';
Tree *tmp = p;
p = p->right;
delete tmp;
if(nodes.empty())
root = p;
else
nodes.top()->left = p;
}
}
return;
}
void inputOrder(Tree* &root, int value)
{
Tree *p = root;
while(p != NULL)
{
if(value < p->value)
{
if(p->left == NULL)
{
p->left = new Tree(value);
return;
}
else
p = p->left;
}
else
{
if(p->right == NULL)
{
p->right = new Tree(value);
return;
}
else
p = p->right;
}
}
root = new Tree(value);
return;
}
int main(void)
{
Tree *root = NULL;
int arr[10];//就假设10个序号好了
int last = 0;
for(int i = 0;i<10;i++)
cin>>arr[i];
for(int i = 0;i<10;i++)
{
inputOrder(root, arr[i]);
if(arr[i] == last + 1)
{
outputOrder(root, last);
cout<<endl;
}
}
return 0;
}
输入:
1 2 4 5 7 3 10 9 6 8
输出:
1
2
3 4 5
6 7
8 9 10
总结
被虐得不轻,得找个系统的复习方法才行。。
少玩游戏多看书,下次再战 (ง •̀•́)ง
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。