我是怎麼被阿里筆試虐成狗的

今天阿里實習生招聘在線筆試,我投的職位是研發工程師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

總結

被虐得不輕,得找個系統的複習方法才行。。

少玩遊戲多看書,下次再戰 (ง •̀•́)ง

相關文章
相關標籤/搜索