1

今天阿里实习生招聘在线笔试,我投的职位是研发工程师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

总结

被虐得不轻,得找个系统的复习方法才行。。

少玩游戏多看书,下次再战 (ง •̀•́)ง


spacelan
925 声望4 粉丝