2019年最新的阿里、騰訊、百度、美團、頭條等大廠技術面試題目近日被彙總整理,專家出題人分析彙總以及答案也在逐步補全中。目前該項目在GitHub上已得到超22580個Star,內容分爲阿里篇、華爲篇、百度篇、騰訊篇、美團篇、頭條篇、滴滴篇、京東篇、MySQL篇、Redis篇、MongDB篇、ZooKeeper篇、Nginx篇、算法篇、內存篇、CPU篇、磁盤篇、網絡通訊篇、安全篇、併發篇。很少說了,來一塊兒看看吧。(文末附有免費領取方式)java
阿里篇node
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 資深技術專家
緩存
參考答案:
安全
* 考察點
微信
一、基礎算法的靈活應用能力(二分法學過數據結構的同窗都知道,但不必定往這個方向考慮;若是學過數值計算的同窗,應該還要能想到牛頓迭代法並解釋清楚)
網絡
二、退出條件設計
數據結構
* 解決辦法
查找,如: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)
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 資深技術專家
參考答案:
* 考察點
一、基礎數據結構的理解和編碼能力
二、遞歸使用
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進階資料和最新面試題目及解析
請添加博主微信
「變強沒有捷徑,惟有不斷學習。」