今天阿里實習生招聘在線筆試,我投的職位是研發工程師C/C++。node
筆試分兩部分,單項選擇題和附加題。ios
作題時忘了記錄,如今開始回憶,不保證完整性和正確性。算法
單項選擇共20題,40分鐘完成。題目涵蓋了:數據庫
C/C++基礎知識
指針
鏈表
sizeof
類、繼承、多態,以及類的實例的內存結構編程
機率與統計
好多這類的題目,,各類排列組合還有什麼正態模糊集,,感受以前都白學了T_T數據結構
算法
四車,姑且這麼稱呼吧,相似於八皇后
鋪地磚,2*8的地面上鋪滿1*2的地磚和L型地磚的方法總數負載均衡
數據庫
主要考SQL,不會,妥妥地跪單元測試
數據結構
二叉排序樹,紅黑樹,各類操做的時間複雜度
圖論,有向圖連通分支測試
STL
stack,實現方式
bitset,做用
vector,容量擴展spa
容錯機制
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
被虐得不輕,得找個系統的複習方法才行。。
少玩遊戲多看書,下次再戰 (ง •̀•́)ง