面試之前把百度C++的面經捋了一遍。
面試總結:
1. 強度大。三輪技術面,中間幾乎不休息。時間長度在三小時到四個半小時之間(我就被連續搞了四個半小時)。個人來說,一面偏實習項目介紹和算法。實習項目摳的非常細,面試官把各種情況的處理問了一遍,假如不是你做的肯定會被問的比較尷尬。。。項目結束兩道算法題,一道劍指 offer裏複雜鏈表複製,第二道讓對其進行優化,要求比劍指 offer裏的實現算法少一半時間。二面主要問算法題。兩道,都與海量數據處理優化有關。會穿插問開放性的題目。三面一道動態規劃,一道存儲的優化。三面應該是主管,會問個人的其他問題,不全是技術。百度面試後一個周出結果,整體效率高,不拖沓,面試強度大。附上自己整理的面經,比較亂,有空整理,內容算比較全。
算法:
3、手寫算法:反轉鏈表(經典題麼????)
2、手寫算法:單鏈表求和
1、手寫堆排序
1、手寫算法:隨機散列長
輸出字符串中最長的迴文子串長度?
5、桶排序】
7、瞭解數據結構?圖如何表示?圖廣度遍歷用什麼結構?
4、熟悉設計模式?手寫下單例模式?
9、數組存中在一個大於n/2次的數,如何以最優方法查找它?
10、用棧實現隊列,用隊列實現棧?
ab ba互爲兄弟子串 abc acd也是,求字典中兄弟子串的個數,其實就是把字符串按字典序排序,然後記錄重複數量,用hash來記錄。
- 統計一個文件中前十多的ip地址
- https://blog.csdn.net/FX677588/article/details/72643302
- https://zhidao.baidu.com/question/402662928.html
- topk問題
- 寫一個strcmp
- 尋找最長的遞增子序列
- LRU實現,以及幾種優化
- 棧的逆序操作,不能使用額外的數據結構。
- 二面:連續子數組最大和(dp問題)
排序,所有數字大小都在a到b之間,要求線性時間
- 寫個string類
- 12、64匹馬、8賽道,知識多少輪比賽找出速度最快的4匹馬?(在提示下優化到12次,最優解爲10或者11次)
3、常見排序算法,快速排序時間複雜度,時間複雜度穩定在O(nlogn)的排序算法
4、100G的數組排序,只有2G內存,怎麼排序
假設1-10000這一萬個數中缺了一個怎麼把他找出來,缺倆個,缺多個。如果範圍爲1-1e呢?
假設給你一個數n,問你這個數是不是2^k次,你的算法時間複雜度是多少,如果有一億個數,如果數的範圍在2^64範圍內呢。
兩個單向鏈表,有公共節點,有多少種結構。(考慮有環和無環的各種情況)
鏈表隨機得到一個數字(最多遍歷一遍,隨機地返回其中任意一個數,我理解了很久,最後我想出的答案應該是錯了。。。)
131個金幣,其中有一個是假幣,找出來
8、還是LRU cache,用鏈表和哈希表實現
9、代碼題:輸入一個數組和一個target,將數組中小於target的數放到數組左邊,大於target的數放到數組右邊。
問了數據結構,數組和鏈表的區別,棧和隊列的區別,如何用棧查找最小值;
寫個string_to_float
n個有序鏈表,合併成一個
字符串A,B,在A中刪除B中出現過的字符
對一個文件做處理,取出帶A關鍵字的行的最後一個字符串,統計重複度。一開始要我用shell腳本寫,我說不會,就讓我C++寫
整數數組A[n],元素取值範圍在[l,u]之間,排序,時間複雜度要爲線性,穩定排序。寫了個桶排
二叉樹知道後序中序求前序遍歷
6)數組連續子數組的最大和
12,什麼是單向鏈表,如何判斷兩個單向鏈表是否相交,手寫代碼,並分析時間複雜度
3.手撕代碼,求二叉樹的寬度(層次遍歷,節點數最多那層的寬度,即爲二叉樹的寬度);
找到數組中只出現一次的數 找到1~n-1的數中重複的數 找到數組中第k大的數
寫出40以內的質數,連續相鄰的兩個質數,如果相差爲2的話,那麼中間那個數一定是6的倍數,證明它
堆排序和快排
.求topk,說思路;(tips:①排序②堆③快排思想
兩道編程:尋找兩個單鏈表的相交點、字符串按單詞逆序。
2.給a,b兩個文件,裏面分別有50億個URL,每個URL大小64B,給4G內存,求相同的URL。
3.編程:給一個字符串比如“19213112”,返回所有可能的ip地址返回“192.13.11.2”“192.1.31.12”
2.從一組數中找出和爲sum的三個數(leetcode原題,先sort再找,並且剪枝),寫代碼,四個數呢?說思路。
3.快排過程,如何用單鏈表實現快排?(用兩個從頭出發的指針實現)
5.若干個二叉樹,如何按照層序遍歷。(即先遍歷樹1的頭結點,再遍歷樹2的……)
7.string轉float,寫完後,告訴我沒考慮異常情況(string中含有字母等)
2、智力題:對一批編號爲1-100,全部開關朝上(開)的燈進行以下***作:凡是1的倍數反方向撥一次開關;2的倍數反方向又撥一次開關;3的倍數反方向又撥一次開關……問:最後爲關熄狀態的燈的編號是哪些?
4、數據庫的範式?
https://blog.csdn.net/Dove_Knowledge/article/details/71434960
https://blog.csdn.net/QingKing520/article/details/52937728
5、如何防止數據庫被攻擊?(我:我項目裏的數據庫不會被攻擊)
https://blog.csdn.net/websinesafe/article/details/80821984
6、linux的指令都知道哪些?
3、TCP和UDP都介紹一下,TCP-UDP區別?都適用於哪些業務場景?
首先還是把協議特性說一下,明白了特性自然知道應用場合了,嘿嘿!兩種協議都是傳輸層協議,爲應用層提供信息載體。TCP協議是基於連接的可靠協議,有流量控制和差錯控制,也正因爲有可靠性的保證和控制手段,所以傳輸效率比UDP低;UDP協議是基於無連接的不可靠協議,沒有控制手段,僅僅是將數據發送給對方,因此效率比TCP要高。
基於上述特性,不難得到結論,TCP協議適用於對效率要求相對低,但對準確性要求相對高的場景下,或者是有一種連接概念的場景下;而UDP協議適用於對效率要求相對高,對準確性要求相對低的場景。
好了,現在回到你的問題,舉幾個應用的例子。TCP一般用於文件傳輸(FTP HTTP 對數據準確性要求高,速度可以相對慢),發送或接收郵件(POP IMAP SMTP 對數據準確性要求高,非緊急應用),遠程登錄(TELNET SSH 對數據準確性有一定要求,有連接的概念)等等;UDP一般用於即時通信(QQ聊天 對數據準確性和丟包要求比較低,但速度必須快),在線視頻(RTSP 速度一定要快,保證視頻連續,但是偶爾花了一個圖像幀,人們還是能接受的),網絡語音電話(VoIP 語音數據包一般比較小,需要高速發送,偶爾斷音或串音也沒有問題)等等。
作爲知識的擴展,可以再說一些其他應用。比如,TCP可以用於網絡數據庫,分佈式高精度計算系統的數據傳輸;UDP可以用於服務系統內部之間的數據傳輸,因爲數據可能比較多,內部系統局域網內的丟包錯包率又很低,即便丟包,頂多是操作無效,這種情況下,UDP經常被使用。
6、hash衝突怎麼解決
3、linux下如何快速將文件每行倒序輸出?shell或者編程都行,說了下python和c++實現方法,結果人考的是tac命令
描述四次揮手過程,以及timewait、closewait?
timewait過程如果出現過多擁塞或者網絡不穩定導致很多非正常數據該如何解決?
6、手撕sql查詢排序?
如何通過索引優化該sql?
談談Innodb中b+樹?myisam和Innodb中b樹有什麼區別?
char (*p) [] 、char *p[]、char (*p)()的區別?
6、談談web上訪問網址的過程?點開網頁發生了什麼
說說DNS如何找到ip和port的?若本地和局域網查找不到,如何向上層查找(DNS服務迭代查詢和遞歸查詢的流程)?
http和http2區別?http和https區別
https中加密實在哪一過程進行了?
7、說說select、poll、epoll區別?
8、熟悉句柄麼?程序執行後句柄如何處理,如何修改可打開句柄數量?
11、如何設計一個高併發的分佈式服務器?
操作系統虛擬內存和物理內存的區別
gdb調試
如何設計服務端程序
- 二進制中一個的個數
- 把一個32位的int轉成ip地址,八位對應一個ip的四分之一。
一方發數據,另外一方不調用recv接收,中間會發生什麼報文。
頭文件中聲明static變量,非static呢
多態的實現方式
進程通信方式
共享內存如何實現
- 單例模式和觀察者模式的類圖
- URL短網址設計,扯了很長時間
網站server與client間的通信安全,攻擊者僞造身份怎麼辦,中間人攻擊怎麼防禦
Linux的內存管理、slab機制介紹一下
https://blog.csdn.net/bullbat/article/details/7194794
網卡的工作流程
設計一個網站,實現多人同時搶票功能,保證先點擊的人先進入頁面,人滿了或者沒票了需拒絕
如何實現多人搶紅包的功能,保證高併發和數據的一致性
實現一個聊天工具,在底層如何設計存儲的數據信息,以支持類似微信聊天一樣,支持刪除信息(信息自己看不到,別人看得到)、撤回信息(信息自己看不到,別人看不到)和轉發信息
缺頁中斷什麼時候會發生
寫一個波浪子序列的題
linux中VFS是什麼,和其他具體的文件系統如何配合工作的
用什麼來保證共享數據的安全性?
是原子操作。。
- 數據庫索引 索引原理 以及如何優化數據庫
- 爲什麼繼承時基類的析構一般聲明爲虛函數?
- 虛函數與純虛函數的區別
- 爲什麼構造函數不能夠使虛函數
C++拷貝構造函數爲什麼傳引用
如何返回值一個類的構造和拷貝構造
如果聲明爲私有的,那麼是編譯時錯誤還是運行時錯誤
vector越界訪問下標
C++中內存泄漏問題
new和malloc的區別
連續子數組最大和問題
紅黑樹的插入效率,爲什麼相對平衡的紅黑樹比絕對平衡的AVL適用廣
B樹和B+樹的區別,B+樹應用在哪?
select和epoll,epoll底層實現,數據的拷貝方式。
實現一個功能,能檢測內存泄漏問題,通過一個指令輸出整個進程中哪一行哪個函數申請了多少內存,按照順序排列出來,還有總的內存數
這個怎麼實現同步和互斥,怎麼樣去加鎖
A:然後說了一下鎖的相關知識,balabala
Q:c++裏面的同步和互斥怎麼實現的
A:mutex,條件變量之類的說了一下,消費者生產者之類的舉了個例子
Q:c++裏面的常量怎麼定義
A:const和constexpr
Q:c++的智能指針說一下
Q:c++怎麼實現一個函數先於main函數運行
A:用static 定義在main( )函數之前的全局對象、靜態對象的構造函數在main( )函數之前執行。
Q:c++的static的變量的初始化順序怎麼樣的
A:聲明順序就是初始化順序
Q:如果一個類裏面呢?
類外初始化
Q:兩個文件,兩個static變量a和b,怎麼讓某個變量先於另外一個初始化呢?0816
A:通過頭文件的聲明順序
Q:其他用戶不知道頭文件的聲明順序怎麼確定呢?
Q:來一條設計題。百度搜索的智能提示怎麼實現,輸入兩個字,出來一些熱搜
A:字典樹+堆吧
項目使用TCP長鏈接還是短鏈接,優缺點和各種適應的場景?
3)一致性哈希
5)紅黑樹設置紅黑節點的作用,插入時間複雜度
8)多態 虛函數 虛表實習原理
11)求根號n
13)爲什麼使用epoll,epoll爲什麼高效,epoll回調是證明實現的
14)讀套接口時候返回0,時候產生EAGIN。【EAGIN也不太清楚,知道又這個玩意,不知道具體的,應該直接說不知道】
輸出字符串用%s,輸出常整型用什麼。
3)vector大小爲100,範圍1000的位置會怎樣,map用【】範圍不存在的key會怎樣
4)new和maloc的區別
6)數組連續子數組的最大和
7)1到100的隨機數,生成1到10000的隨機數
8)linux常用命令
解釋一下 函數重載 是怎麼實現的
- 編譯器在彙編層結合函數名和參數類型給重載等函數不同的彙編實現。
- C/C++ 時混編要使用extern告訴編譯器這是不支持重載的C的代碼
解釋一下可變參數怎麼實現的
解釋一下函數調用是怎麼樣的過程(怎麼傳參)
- 簡述函數棧幀圖,即使用兩個寄存器分別指向棧底(ebp)與棧頂(esp),通過ebp +— n訪問變量or回到上一個棧幀
- 函數棧幀 https://www.cnblogs.com/zlcxbb/p/5759776.html
基於上一個問題,解釋一下多個參數的情況
- 參數從右向左壓棧,所以最後一個壓入的元素是第一個參數
- ebp-4放置了之前棧幀的返回地址,ebp到目標地址之間都是壓入的參數
- 函數棧幀 https://www.cnblogs.com/zlcxbb/p/5759776.html
-
解釋一下 C++ 引用和指針的區別
- 兩者在彙編層面沒有本質區別
- 概念上講,引用是變量的別名,具體區別如下
-
- 指針不用初始化,而引用則需要
- 指針的指向可修改,引用從一而終
- 指針自增:指針偏移;引用自增:相當於原變量自增
- sizeof(指針),32位4字節;sizeof(引用)== sizeof(變量)
- 有多級指針,無多級引用
- 引用更安全(指針判空)
解釋一下 map和hash_map
解釋一下函數調用,比如 求最大值函數 和 fork/exec 函數有什麼區別
- 前者在用戶態完成操作,後者由於權限問題,需要在內核態由內核完成
- string類的實現、
- 編程題第二道 單詞統計
struct和class的區別
3,給一個struct分析佔用多少內存
5,裝飾器模式和單例模式,使用單例模式應該注意什麼
8,什麼是死鎖,怎麼避免死鎖
.linux命令求topk?(tip:多謝樓下大佬,sort+head即可)
5.TCP報文格式,http長短連接?
1.寫10個你熟悉的linux命令,帶上你知道的所有參數;(寫得不好,心理壓力+1)
epoll底層實現
異步非阻塞io是什麼樣的模型,別的模型呢
線程池的實現
進程線程區別,公用和獨立的部分
怎麼查看進程佔用內存
爲什麼線程更快
線程安全知道哪些方法
你說互斥鎖和條件變量,這樣會帶來資源的競爭,知道什麼優化辦法嗎
B+樹和紅黑樹的差別,B+樹的應用和時間複雜度
epoll的水平觸發和邊沿觸發(這一塊問的很深就,涉及到底層的實現和數據處理一半的情況等等)
如何解決高併發
如何實現數據容災
怎樣實現負載均衡
如何解決單節點負載過高(我答的通過監控與設置閾值,然後分流遷移,然後又問流量遷移了,數據怎麼辦,反正就是往深處問)
系統中的一致性問題
線程怎麼訪問互相的棧
虛繼承,多繼承
string的length和size一樣嗎
string是怎麼增長的
1.libevent實現,IO+定時+信號事件如何集成統一
4.寫代碼,判斷一個字符串中括號()、[]、{}的使用是否對應
5.給定兩個日期,計算天數差
6.一個數組最大連續子數組和?一個矩陣最大子矩陣和?
實現一個Stack類 要求 push pop max 操作時間都是O(1)
算法就提了一下 二分查找和快速排序
給你一個數字n,返回一個數組,數組爲0-n這n個數每個數bit爲1的位數(答案爲找規律),時間複雜度要去爲o(n),n前面不能有係數。
說一下快排和堆排序的時間複雜度一樣,爲什麼使用快排的時候多一些。
1.多態能不能靜態調用
2.內存中 堆和棧 的區別,棧底層如何實現?是一上來就分配4MB嗎?缺頁中斷時操作系統怎麼做?
3.epoll和select底層使用的數據結構
epoll的高效就在於,當我們調用epoll_ctl往裏塞入百萬個句柄時,epoll_wait仍然可以飛快的返回,並有效的將發生事件的句柄給我們用戶。這是由於我們在調用epoll_create時,內核除了幫我們在epoll文件系統裏建了個file結點,在內核cache裏建了個紅黑樹用於存儲以後epoll_ctl傳來的socket外,還會再建立一個list鏈表,用於存儲準備就緒的事件,當epoll_wait調用時,僅僅觀察這個list鏈表裏有沒有數據即可。有數據就返回,沒有數據就sleep,等到timeout時間到後即使鏈表沒數據也返回。所以,epoll_wait非常高效。
4.給一個長方形,兩個人分別在長方形裏放硬幣,硬幣不能重疊,不能超出長方形以外,最後放的人獲勝,問第一個放硬幣的人必勝嗎?
1 二叉樹前序遍歷,知道前序中序怎麼確定二叉樹,爲什麼知道前後不能確定
5虛擬內存介紹,new 2g內存,物理內存夠,會在物理內存上嗎?
6進程線程區別,多線程共享哪些資源
13什麼時候開始事物(答得不好)
14inux查看監聽端口,某個pid佔用cpu,top
c++如何實現一個接口?(抽象類、純虛函數)
傳遞一個指針進某函數體內,爲什麼不能對它重新分配空間
如果傳入的是一級指針S的話,
那麼函數中將使用的是S的拷貝,
要改變S的值,只能傳入指向S的指針,即二級指針
,如果想要分配,應該怎麼做?(指針的指針)
5.memcpy存在的問題(如果複製的地址有重疊,可能出現問題)?用memmove爲什麼不會有這種問題?請實現?(memmove開闢了一塊臨時空間)
6.相同二叉樹(好像是任一層被顛倒順序仍然認爲這兩顆樹相同,例如root1->left = a,root2->right=b,仍然認爲他們相同),計算你解法的時間複雜度。
8.叉樹非遞歸後續遍歷,
面試官然後出了2個算法題,一個是判斷一個int有多少個1,一個是複雜鏈表的深拷貝,也是秒殺,然後就過了。
來了之後問STL熟悉麼,喜歡什麼容器,樓主說到map,問map怎麼實現,紅黑樹,紅黑樹是啥,紅黑樹插入操作是怎麼樣的,當時就懵逼了,我說紅黑樹的插入太複雜了吧,我寫個AVL樹的插入吧,然後給我一個樹,讓我往裏面插數,反正就是左旋右旋啥的,沒問題。
然後做題,實現一個返回棧中最小數的函數,設計了一個 類,很簡單。然後最後問了一個,大數據,幾億個數據排序,樓主說用位圖,簡單說了說思路,面試官說思路基本對,
特殊的地方,不允許使用STL容器,自己實現鏈表或是數組,要寫出完整功能,包括構造析構函數。注意邊界情況和內存泄漏
用你知道的同步機制實現一個讀寫鎖。。。這個寫了很久,最後勉強出來了
實現strcpy、問了linux一些命令
生產者消費者模型
介紹一下算法的時間複雜度與空間複雜度。
說一下c++的特性。
編譯器對於虛函數是怎麼處理的。
c++的內存分配方式。
說一下編譯器對虛函數的處理,還是這個問題。(沒答上來,只記得有一個虛函數表)
c語言各種變量所在的節
2. 手寫memcpy
3. linux下的malloc和free底層都幹了什麼事(調用free貌似系統不一定會真正釋放內存)
6. map遍歷刪除(考慮迭代器失效)
5、kill,強制退出以及兩個不能被忽略或捕獲的信號:SIGKILL和SIGSTOP
6、awk輸出第二列數字的平均值
9、大端和小端
1、linux的內存管理,保證多個線程訪問同一塊內存的訪問安全
2、互斥鎖和自旋鎖
4、靜態的多態(即模板)相對動態多態的優勢,主要是運行時的性能較高