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進階資料和最新面試題目及解析
請添加博主微信
“變強沒有捷徑,唯有不斷學習。”