2018 秋招 百度二輪面試---血淋淋的經歷寫實
2017 秋招 百度二輪面試—血淋淋的經歷寫實
一名自信向上的良好青年,參加百度面試被面試官按在地板來回摩擦~(不知是哪位好漢說的,借用一下)
簡單回顧一下,下午的經歷吧
下午百度二面對話大概是這樣的。
面:這個知道嗎?
我:不知道。
面:這個呢?
我:不知道。
面:那我問你這個吧。
我:知道。
面:看過原始碼嗎,底層是怎麼實現的?
我:。。。。。。
面:好吧,下一個問題
場面巨尷尬
下面是具體的問題,可能有忘記的題.沒有自我介紹..
1,安卓原始碼看過多少
有時候看到某個函式,心血來潮可能會點進去看看是如何實現的,但是沒有集體性看過.
2,RecyclerView怎麼實現的?不知道啊,那你說說是怎麼用的?
怎麼實現的,我是真的沒有一個大體的認識,之前沒去集體看過RecyclerView的原始碼,最多隻是知道幾個方法是怎麼實現的.怎麼用的我就不說了,大家都比我清楚.
原始碼分析可以看看大神的文章搭配起看看原始碼吧:
3,執行緒池,用過嗎?
我:聽說過,沒用過.
看看大神的文章吧
4,Service和IntentService區別
推薦文章:
4.1,service的啟動方式有幾種,分別是什麼?生命週期有什麼區別?多次呼叫startService()會啟動多個Service嗎?bindServive呢?
如果一個 Service 已經被啟動,其他程式碼再試圖呼叫 startService() 方法,是不會執行 onCreate() 的,但會重新執行一次 onStartCommand()
看我的Github筆記了解具體詳情:
5,TreeMap幹什麼的,怎麼用
說實話,我平時確實沒怎麼用過這個,除了當時在學習時.就是一個排序的?
馬克-to-win:TreeSet是按升序順序輸出的。TreeMap也是按升序輸出,但是和它的區別就是TreeSet儲存的是單個元素,而TreeMap儲存的是一個一個的鍵值對。
6,實現單鏈表倒置,手寫
/*-----------------將鏈式表就地倒置-------------------*/
//將鏈式表就地倒置 一
Status Convert1(LinkList &L)
{
/*
為了反轉這個單鏈表,我們先讓頭結點的next域指向結點2,
再讓結點1的next域指向結點3,最後將結點2的next域指向結點1,
就完成了第一次交換,順序就變成了Header-結點2-結點1-結點3-結點4-NULL
,然後進行相同的交換將結點3移動到結點2的前面,
然後再將結點4移動到結點3的前面就完成了反轉,思路有了,就該寫程式碼了:
*/
LNODE *tmp = NULL;
LNODE *p = NULL;
if(L==NULL)
{
return ERROR;
}
tmp = L->next; //指向第二個
while(tmp->next!=NULL) //當需要換到第一個的元素不為空
{
p = tmp->next; //p為tmp的下一個,也就是需要切換到第一個的元素
tmp->next = p->next; //讓tmp指向需要需要切換到第一個的元素的下一個元素
p->next = L->next; //讓p指向剛才的第一個元素
L->next = p; //p變成第一個
}
return OK;
}
//將鏈式表就地倒置 二 (易懂)
Status Convert2(LinkList &L)
{
//從連結串列首元素開始一直往後遍歷,將遍歷到的元素指向前一個元素
LinkList p,r,q;
p = NULL;
q = L->next;
while(q) //讓下一個元素指向上一個元素
{
r = q->next; //r是q的下一個
q->next = p; //(第一次時,下一個指向新的頭指標),以後每次都是下一個指向上一個元素
p = q; //新的連結串列向後移
q = r; //舊的連結串列向前移
}
L->next = p;
return OK;
}
7,二叉樹後序遍歷,手寫
/*-------------後序遍歷----------*/
void preorder3(BiTree T)
{
if(T) //如果還能往下
{
preorder3(T->lchild); //從該節點往左孩子方向探索指標
preorder3(T->rchild);
cout<<T->data<<endl; //後續遍歷
}
}
8,新開一個執行緒和開一個IntentService有什麼區別。假如系統記憶體不足,誰先被幹掉?
(1)前臺程序
是使用者操作所必須的,任一時間下,僅有少數程序會處於前臺,這樣的程序擁有一個在螢幕上顯示並和使用者互動的 activity 或者它的一個IntentReciver 正在執行。僅當記憶體實在無法供給它們維持同時執行時才會被殺死。一般來說,在這種情況下,裝置依然處於使用虛擬記憶體的狀態,必須要殺死一些前臺程序以使用者介面保持響應。
(2)可視程序
沒有前臺元件,但仍可被使用者在螢幕上所見。當滿足如下任一條件時,程序被認為是可視的:
●它包含著一個不在前臺,但仍然為使用者可見的activity(它的onPause()方法被呼叫)。這種情況可能出現在以下情況:比如說,前臺activity是一個對話方塊,而之前的Activity位於其下並可以看到。
●它包含了一個繫結至一個可視的activity的服務。
可視程序依然被視為是很重要的,非到不殺死它們便無法維持前臺程序執行時,才會被殺死。
(3)服務程序
是由startService() 方法啟動的服務,它不會變成上述兩類。儘管服務程序不會直接為使用者所見,但它們一般都在做著使用者所關心的事情(比如在後臺播放mp3或者從網上下載東西)。所以系統會盡量維持它們的執行,除非系統記憶體不足以維持前臺程序和可視程序的執行需要。
(4)背景程序
包含目前不為使用者所見的activity(Activity物件的onStop() 方法已被呼叫)。這些程序與使用者體驗沒有直接的聯絡,可以在任意時間被殺死以回收記憶體供前臺程序、可視程序以及服務程序使用。一般來說,會有很多背景程序執行,所以它們一般存放於一個LRU(最後使用)列表中以確保最後被使用者使用的activity最後被殺死。如果一個activity正確的實現了生命週期方法,並捕獲了正確的狀態,則殺死它的程序對使用者體驗不會有任何不良影響。
(5)空程序
不包含任何活動應用程式元件。這種程序存在的唯一原因是做為快取以改善元件再次於其中執行時的啟動時間。系統經常會殺死這種程序以保持程序快取和系統核心快取之間的平衡。
9,List和Set集合存放物件時的區別
10,說說你最擅長的領域,比如安卓中的某個東西,或者演算法,資料結構,網路。
11,說出你的優點和缺點。說說最值得你驕傲的事情。
12,關注最新的技術?說說學過Kotlin哪些東西?我:學過一些語法和寫過幾個demo。面:什麼,就只是語法層?好吧,下一個問題
13,二分查詢的時間複雜度
總共有n個元素,每次查詢的區間大小就是n,n/2,n/4,…,n/2^k(接下來操作元素的剩餘個數),其中k就是迴圈的次數。
由於n/2^k取整後>=1,即令n/2^k=1,
可得k=log2n,(是以2為底,n的對數),所以時間複雜度可以表示O()=O(logn)
14,Activity.OnNewIntent()解釋一下是什麼?
15,怎麼利用handler實現主執行緒和子執行緒通訊?MessageQueue是什麼?子執行緒實現hander應該注意什麼?
這個剛好知道.哈哈
16,ThreadLocal用過嗎?
17,HandlerThread用過嗎?
18,Java中是怎麼實現執行緒同步的?假如我定義一個類,裡面有一個方法fa()被synchronized修飾了,另一個fb()沒有被修飾。現在宣告2個物件a1,a2,現在2個執行緒同時分別呼叫a1.fa(),a2.fb(),fb()方法中的程式碼會被執行到嗎?
19,會反編譯嗎?我:用過,拿來反編譯其他的app。
20,你覺得你的安卓達到一個什麼樣的水平了?
21,面:好了,還有什麼想問的嗎?
22,回去等訊息吧,待會兒HR小姐姐會聯絡你。過了的話還有三面,大概在這週三。
總結
很多問題不會,場面蜜汁尷尬.好吧,本人菜鳥一枚….
下面是一個朋友(也是這場百度,二面)的問題
計算機網路:http協議概述,特點,運用,http為什麼底層是tcp不是udp ?tcp是基於流式傳輸的,怎麼設計協議,進行協議的解析?抓包工具的原理是啥? socket異常斷開時,設計一個合理的重連機制。 資料結構:叫我寫二叉樹的前序遍歷非遞迴,跟遞迴方式比較時間複雜度,快排的原理。專案:檢測記憶體洩漏的工具,它為什麼能檢測?做過的專案有什麼技術難點(我說的難點在面試官看來都是簡單問題)?思維題:在很多的資料中如何快速找到最大的100個數? 你有什麼創新能力?你還有什麼問題問我?