2019年最新的阿里、騰訊、百度、美團、頭條等大廠技術面試題目近日被匯總整理,專家出題人分析匯總以及答案也在逐步補全中。目前該項目在GitHub上已獲得超22580個Star,內容分為阿里篇、華為篇、百度篇、騰訊篇、美團篇、頭條篇、滴滴篇、京東篇、MySQL篇、Redis篇、MongDB篇、ZooKeeper篇、Nginx篇、算法篇、內存篇、CPU篇、磁盤篇、網絡通信篇、安全篇、並發篇。不多說了,來一起看看吧。(文末附有免費領取方式)
阿里篇
1.1.1 如何實現一個高效的單向鏈表逆序輸出?
出題人:阿里巴巴出題專家:昀龍/阿里雲彈性人工智能負責人
參考答案:下面是其中一種寫法,也可以有不同的寫法,比如遞歸等。供參考。
typedef struct node{ int data;struct node* next; node(int d):data(d), next(NULL){}}node;void reverse(node* head){ if(NULL == head || NULL == head->next){ return; } node* prev=NULL; node* pcur=head->next; node* next; while(pcur!=NULL){ if(pcur->next==NULL){ pcur->next=prev; break; } next=pcur->next; pcur->next=prev; prev=pcur; pcur=next; } head->next=pcur; node*tmp=head->next; while(tmp!=NULL){ cout<<tmp->data<<"\t"; tmp=tmp->next; }}
1.1.2 已知sqrt(2)約等於1.414,要求不用數學庫,求sqrt(2)精確到小數點后10位
出題人:阿里巴巴出題專家:文景/阿里雲 CDN 資深技術專家
參考答案:
* 考察點
1、基礎算法的靈活應用能力(二分法學過數據結構的同學都知道,但不一定往這個方向考慮;如果學過數值計算的同學,應該還要能想到牛頓迭代法並解釋清楚)
2、退出條件設計
* 解決辦法
1. 已知sqrt(2)約等於 1.414,那么就可以在(1.4,1.5)區間做二分
查找,如:a)high=>1.5 b) low=>1.4 c) mid => (high+low)/2=1.45 d) 1.45*1.45>2 ?high=>1.45 : low => 1.45 e) 循環到 c)
2. 退出條件
a) 前后兩次的差值的絕對值<=0.0000000001, 則可退出
const double EPSINON = 0.0000000001;double sqrt2(){double low = 1.4, high = 1.5;double mid = (low + high) / 2;while (high - low > EPSINON){if (mid*mid > 2){high = mid;}else{low = mid;}mid = (high + low) / 2;}return mid;}
1.1.3 給定一個二叉搜索樹(BST),找到樹中第 K 小的節點
出題人:阿里巴巴出題專家:文景/阿里雲 CDN 資深技術專家
參考答案:
* 考察點
1、基礎數據結構的理解和編碼能力
2、遞歸使用
* 示例
5\3 6\2 4/1
說明:保證輸入的 K 滿足 1<=K<=(節點數目)
樹相關的題目,第一眼就想到遞歸求解,左右子樹分別遍歷。聯想到二叉搜索樹的性質,root 大於左子樹,小於右子樹,如果左子樹的節點數目等於 K-1,那么 root 就是結果,否則如果左子樹節點數目小於 K-1,那么結果必然在右子樹,否則就在左子樹。因此在搜索的時候同時返回節點數目,跟 K 做對比,就能得出結果了。
/** * Definition for a binary tree node. **/public class TreeNode { int val; TreeNode left; TreeNode right; TreeNode(int x) { val = x; }}class Solution { private class ResultType { boolean found; //是否找到 int val; //節點數目 ResultType(boolean found, int val) { this.found = found; this.val = val; } } public int kthSmallest(TreeNode root, int k) { return kthSmallestHelper(root, k).val; } private ResultType kthSmallestHelper(TreeNode root, int k) { if (root == null) { return new ResultType(false, 0); } ResultType left = kthSmallestHelper(root.left, k);//左子樹找到,直接返回 if (left.found) { return new ResultType(true, left.val); }//左子樹的節點數目 = K-1,結果為 root的值 if (k - left.val == 1) { return new ResultType(true, root.val); }//右子樹尋找 ResultType right = kthSmallestHelper(root.right, k - left.val - 1); if (right.found) { return new ResultType(true, right.val); }//沒找到,返回節點總數 return new ResultType(false, left.val + 1 + right.val); }}
1.1.4 LRU緩存機制
1.1.5 關於epoll和select的區別,以下哪些說法是正確的
1.1.6 從innodb的索引結構分析,為什么索引的 key 長度不能太長
1.1.7 MySQL的數據如何恢復到任意時間點?
……
華為篇
2.1.0 static有什么用途?(請至少說明兩種)
2.1.1 引用與指針有什么區別?
2.1.2 描述實時系統的基本特性
……
百度篇
3.1.0 在函數內定義一個字符數組,用gets函數輸入字符串的時候,如果輸入越界,為什么程序會崩潰?
3.1.1 C++中引用與指針的區別
3.1.2 C/C++程序的內存分區
……
騰訊篇美團篇頭條篇滴滴篇京東篇MySQL篇Redis篇MongDB篇Zookeeper篇Nginx篇算法篇內存篇cpu篇磁盤篇網絡通信篇安全篇並發篇


免費領取java進階資料和最新面試題目及解析
請添加博主微信
“變強沒有捷徑,唯有不斷學習。”
