百度面試

C++面試題整理3html

百度一面 50分鐘前端

1. strcpy和memcpy的區別java

(1)用途上的不一樣,strcpy只拷貝字符串,而且會是拷貝到字符串的最後一個’\0’結束符結束。而memcpy能夠拷貝任意類型的數據,只要指定要拷貝的字節數。所以須要在使用時指定字節數n。參數以及返回值爲void指針,mysql

(2)用法上的不一樣,strcpy不須要指定長度。linux

也所以,strcpy沒有memcpy安全。ios

 

2. 手寫memcpynginx

    我以爲memcpy就是實現了內存覆蓋安全!!!c++

    而strcpy函數應當是調用memcpy來實現的。所以對於字符串地址有覆蓋的狀況也能正確處理!!!git

 

3. linux下的malloc和free底層都幹了什麼事(調用free貌似系統不必定會真正釋放內存)程序員

malloc

    malloc 是 glibc 中內存分配函數,也是最經常使用的動態內存分配函數,其內存必須經過 free 進行釋放,不然致使內存泄露。

    關於 malloc 得到虛存空間的實現,與 glibc的版本有關,但大致邏輯是:

1. 若分配內存小於 128k ,調用 sbrk() ,將堆頂指針向高地址移動,得到新的虛存空間。

2. 若分配內存大於 128k ,調用 mmap() ,在文件映射區域中分配匿名虛存空間。

3. 這裏討論的是簡單狀況,若是涉及併發可能會複雜一些,不過先不討論。

    其中 sbrk 就是修改棧頂指針位置,而 mmap 可用於生成文件的映射以及匿名頁面的內存,這裏指的是匿名頁面。

    而這個 128k ,是 glibc 的默認配置,可經過函數 mallopt 來設置。

free

    malloc 使用 mmap 分配的內存 ( 大於 128k) , free 會調用 munmap 系統調用立刻還給 OS ,實現真正釋放。

    堆內的內存,只有釋放堆頂的空間,同時堆頂總連續空閒空間大於 128k 才使用 sbrk(-SIZE) 回收內存,真正歸還 OS 。

    堆內的空閒空間,是不會歸還給 OS 的。

 

4. 手寫一個類(考察類的前置聲明)

【稍微注意一下類的前置聲明以及頭文件包含的區別】

 究竟何時須要前置聲明,何時須要頭文件包含呢?

      頭文件包含實際上是一想很煩瑣的工做,不但咱們看着累,編譯器編譯的時候也很累,再加上頭文件中經常出現的宏定義。感受各類宏定義的展開是很是耗時間的,遠不如自定義函數來得速度。我僅就不一樣頭文件、源文件間的句則結構問題提出兩點原則,僅供參考:

  第一個原則應該是,若是能夠不包含頭文件,那就不要包含了。這時候前置聲明能夠解決問題。若是使用的僅僅是一個類的指針,沒有使用這個類的具體對象(非指針),也沒有訪問到類的具體成員,那麼前置聲明就能夠了。由於指針這一數據類型的大小是特定的,編譯器能夠獲知。

  第二個原則應該是,儘可能在CPP文件中包含頭文件,而非在頭文件中。假設類A的一個成員是是一個指向類B的指針,在類A的頭文件中使用了類B的前置聲明並編譯成功,那麼在A的實現中咱們須要訪問B的具體成員,所以須要包含頭文件,那麼咱們應該在類A的實現部分(CPP文件)包含類B的頭文件而非在聲明部分(H文件)包含。

若是使用object reference 或 object point 能夠完成任務,就不要用object

這樣能夠盡最大可能避免#include

爲聲明式和定義式提供不一樣的頭文件

 

5. epoll和select的區別

6. map遍歷刪除(考慮迭代器失效)

c++容器的元素刪除兩個原則:

1) 若是容器是標準序列容器,寫一個循環來遍歷容器元素,每當調用erase時記得都用它的返回值更新你的迭代器。

2) 若是容器是標準關聯容器,寫一個循環來遍歷容器元素,當把迭代器傳給erase時記得後置遞增它(例子同上) 。

    也就是說,map之類的容器並不須要考慮迭代器失效,只有vector、deque之類的連續空間的迭代器才須要考慮。

(1)vector的刪除

 vector <int>::iterator iter=vecInt.begin();

for ( ;iter!=vecInt.end();)

{

        iter=vecInt.erase(iter);

}

j= vecInt.capacity();      //j=512

i = vecInt.size();         //i=0 

【最好的當即刪除全部的vector而且不會遺留capacity空間的方式是vector<int>().swap(vecInt)】

(2)map的刪除

    for(map<int,int>::iterator it = m.begin(); it!=m.end(); it++){

        m.erase(it->first);

    }

 

7. 手寫快排

 

【第二篇】

1. 單鏈表反轉,複雜鏈表複製

2. time_wait狀態。Syn_flood攻擊,time_wait狀態會帶來什麼問題。

 

3. Explict關鍵字的做用

       避免隱式類型轉換。C++中的explicit關鍵字只能用於修飾只有一個參數的類構造函數, 它的做用是代表該構造函數是顯示的, 而非隱式的, 跟它相對應的另外一個關鍵字是implicit, 意思是隱藏的,類構造函數默認狀況下即聲明爲implicit(隱式).

       在大部分狀況中,隱式轉換卻容易致使錯誤(不是語法錯誤,編譯器不會報錯)。隱式轉換老是在咱們沒有察覺的狀況下悄悄發生,除非有心所爲,隱式轉換經常是咱們所不但願發生的。經過將構造函數聲明爲explicit(顯式)的方式能夠抑制隱式轉換。也就是說,explicit構造函數必須顯式調用。

4. 爲啥虛函數要定義成virtual

 

5. 三次握手過程,爲啥要三次握手

6. 大文件中找重複記錄次數最多的記錄

7. 鏈表的迴文判斷(鏈表每一個節點存一個字符,判斷該鏈表全部結點組成的字符串是否是迴文字符串)

 

8. C++智能指針循環引用

class Child;

class Parent{

public:

    shared_ptr<Child> child;

}

class Child{

public:

    shared_ptr<Parent> parent;

}

int main(int argc, const char * argv[]) {

    shared_ptr<Child> child(new Child);

    shared_ptr<Parent> parent(new Parent);

    child->parent = parent;

    parent->child = child;

    return 0;

}

 

9. 線程池的原理

 

【第三篇】

1. 進程調度算法,時間片輪轉的時間片是怎麼計時的?

先進先出,最短做業優先,最高響應比優先,時間片輪轉,多級反饋隊列

多級反饋隊列調度算法描述:
  一、進程在進入待調度的隊列等待時,首先進入優先級最高的Q1等待。
  二、首先調度優先級高的隊列中的進程。若高優先級中隊列中已沒有調度的進程,則調度次優先級隊列中的進程。例如:Q1,Q2,Q3三個隊列,只有在Q1中沒有進程等待時纔去調度Q2,同理,只有Q1,Q2都爲空時纔會去調度Q3。
  三、對於同一個隊列中的各個進程,按照時間片輪轉法調度。好比Q1隊列的時間片爲N,那麼Q1中的做業在經歷了N個時間片後若尚未完成,則進入Q2隊列等待,若Q2的時間片用完後做業還不能完成,一直進入下一級隊列,直至完成。
  四、在低優先級的隊列中的進程在運行時,又有新到達的做業,那麼在運行完這個時間片後,CPU立刻分配給新到達的做業(搶佔式)。
  在多級反饋隊列調度算法中,若是規定第一個隊列的時間片略大於多數人機交互所需之處理時間時,便可以較好的知足各類類型用戶的須要。

2. 內存比硬盤快多少倍?

 

要趕忙再看一遍的:

1. ARP協議(具體,詳盡)

用ping說明ARP工做的原理

假設咱們的計算機IP地址是192.168.1.1,要執行這個命令:ping192.168.1.2。該命令會經過ICMP協議發送ICMP(以太網控制報文協議)數據包

該過程須要通過下面的步驟:  

1. 應用程序構造數據包,該示例是產生ICMP包,被提交給內核(網絡驅動程序);   

2. 內核檢查是否可以轉化該IP地址爲MAC地址,也就是在本地的ARP緩存中查看IP-MAC對應表;

3. 若是存在該IP-MAC對應關係,那麼跳到步驟<7;

若是不存在該IP-MAC對應關係,那麼接續下面的步驟;

4. 內核進行ARP廣播,目的MAC地址是FF-FF-FF-FF-FF-FF,ARP命令類型爲REQUEST(1),其中包含有本身的MAC地址;   

5. 當192.168.1.2主機接收到該ARP請求後,就發送一個ARP的REPLY(2)命令,其中包含本身的MAC地址;   

6. 本地得到192.168.1.2主機的IP-MAC地址對應關係,並保存到ARP緩存中;   

7. 內核將把IP轉化爲MAC地址,而後封裝在以太網頭結構中,再把數據發送出去;

 

2. url解析,

3. OSI七層,每一層做用(爲何TCP比OSI用得普遍?)

我的簡單概括爲四點:糟糕的提出者,糟糕的技術,糟糕的實現,糟糕的政策

1. 糟糕的提出者:OSI是學者們提出的(面向技術,這也意味着它很複雜,很難應用到實際),TCP則是各大計算機寡頭提出(面向實用,簡化了不少,直接獲得了大量用戶羣)

2. 糟糕的技術:不知道你有沒有發現,OSI中的會話和表示層幾乎是空的,而數據鏈路和網絡層有包含了太多的東西。它所制定的標準和協議都極其複雜,(聽說打印出來能堆1米多)且不少功能重複(如流控和差錯控制)

3. 糟糕的實現:TCP/IP協議族早期是做爲UNIX的一部分,運行很是好,並且是免費的,這使它迅速在程序員中造成了一個龐大的用戶羣。而OSI則一直躺在實驗室,沒接觸到羣衆。

4. 糟糕的政策:當初的學術界都認爲OSI由美國軍方背景,是美國政府的產物;而TCP是UNIX一部分,這使得不少崇尚自由的歐美程序員完全愛上了TCP。

共同點:

1.0 二者都以協議棧的概念爲基礎,而且協議中的協議彼此獨立.

2.0 兩個模型中的各個層的功能也大致類似.

3.0 兩個模型傳輸層之上的各層也都是傳輸服務的用戶,而且用戶是面向應用的用戶.

不一樣點:

1.0 對於OSI/RM模型有三個明確的核心概念.(1)服務,(2)接口,(3)協議.而TCP/IP對此沒有明確的區分.

2.0 OSI/RM模型是在協議發明以前設計的.而TCP/IP是在協議出現以後設計的.

3.0 一個更在的區別在於OSI/RM模型有7層.而TCP/IP只有4層.

4.0 OSI/RM的網絡層同時支持無鏈接和麪向鏈接的通訊,可是在傳輸層上只支持面向鏈接的通訊,

而TCP/IP模型的網絡層上只有一種無鏈接通訊模式,可是在傳輸層上同時支持兩種通訊模式.

 

4. redis高可用怎麼實現的

5. redis怎麼進行主從複製的,數據是怎麼在集羣裏存儲的,怎麼解決高可用問題

【整理關於Redis高可用的演化】

                        1. 主從Redis

       主從redis其實是一種主備模式,即主redis宕機後,能夠切換從redis繼續提供服務。

  缺點:

    1.人爲關注Master是否宕機

    2.沒法完成自動切換主從

    3.從節點的功能未被充分利用

2. sentinel

       爲了解決上述肯定,Redis官方提供了sentinel,保證redis的高可用性

       圖1展現的是sentinel與redis的關係,即sentinel系統對每一個redis實例(主、從)均建立兩個連接:命令鏈接、訂閱鏈接

    命令鏈接:發送INFO命令,與redis保持通訊

    訂閱鏈接:經過訂閱鏈接,自動發現其餘sentinel實例

 

 

       圖2展現一個最小規模的sentinel,即至少由三個sentinel實例組成,當被監視的redis被判斷爲主管下線時,須要從sentinel中選舉零頭sentinel來進行主從切換

優勢:

  1.sentienl能夠監控主從節點的健康情況,下降了人爲監控成本

  2.sentinel能夠完成主從切換

缺點:

  1.從節點依然未被充分利用

  2.沒法作到橫向擴展,提供服務器的只有一個master

3. 分片

 分片思想主要是利用一致性哈希算法,完成redis的橫向擴展

  1.經過zookeeper存儲sentinel的配置信息

  2.在客戶端實現一致性哈希算法,經過路由算法決定redis命令由那個redis實例進行執行

  3.經過增長shard,來分擔單個shard的壓力

缺點:

  1.擴容時涉及到數據遷移,若是redis中只是緩存數據則方便處理,但若是有業務數據強依賴redis,則遷移時只能停機處理

  2.沒法解決冷熱數據問題

 

6. 介紹一下redis{數據結構,底層實現,指令,分佈式處理,鏈式結構,} 說道跳錶的時候

7. 問項目 說到redis哪些方面用的緩存;緩存和數據庫如何同步。

 

8. NIO和AIO

同步非阻塞IO和異步非阻塞IO。

NIO

       NIO自己是基於事件驅動思想來完成的,其主要想解決的是BIO的大併發問題: 在使用同步I/O的網絡應用中,若是要同時處理多個客戶端請求,或是在客戶端要同時和多個服務器進行通信,就必須使用多線程來處理。也就是說,將每個客戶端請求分配給一個線程來單獨處理。這樣作雖然能夠達到咱們的要求,但同時又會帶來另一個問題。因爲每建立一個線程,就要爲這個線程分配必定的內存空間(也叫工做存儲器),並且操做系統自己也對線程的總數有必定的限制。若是客戶端的請求過多,服務端程序可能會由於不堪重負而拒絕客戶端的請求,甚至服務器可能會所以而癱瘓。

       NIO基於Reactor,當socket有流可讀或可寫入socket時,操做系統會相應的通知引用程序進行處理,應用再將流讀取到緩衝區或寫入操做系統。  也就是說,這個時候,已經不是一個鏈接就要對應一個處理線程了,而是有效的請求,對應一個線程,當鏈接沒有數據時,是沒有工做線程來處理的。

       BIO與NIO一個比較重要的不一樣,是咱們使用BIO的時候每每會引入多線程,每一個鏈接一個單獨的線程;而NIO則是使用單線程或者只使用少許的多線程,每一個鏈接共用一個線程。

       NIO的最重要的地方是當一個鏈接建立後,不須要對應一個線程,這個鏈接會被註冊到多路複用器上面,因此全部的鏈接只須要一個線程就能夠搞定,當這個線程中的多路複用器進行輪詢的時候,發現鏈接上有請求的話,纔開啓一個線程進行處理,也就是一個請求一個線程模式。

AIO

 

9. git使用,我把命令和工做原理都說了一遍,而後每一個命令作什麼用的

 

10. c和cpp裏面線程同步的函數接口

11. 共享數據同步有哪些方式【應當就是線程同步的方式吧】

12. 鎖有哪幾種鎖?自旋鎖怎麼實現的?

讀寫鎖,互斥鎖,自旋鎖

 

13. 二叉樹後序遍歷實現

 

14. 斐波那契數列分析複雜度

f(n)+xf(n-1) = y(f(n-1)+xf(n-2))

 

15. main函數執行以前與執行以後

其實程序運行到main函數以前作了不少工做:

       操做系統裝載程序以後,首先運行的代碼並非main的第一行,而是某些特別的代碼,這些代碼準備好main函數執行說須要的環境,而且負責調用main函數,這時候你才能夠再main函數裏放心大膽的寫各類代碼:申請內存、使用系統調用、觸發異常、訪問IO。在main函數返回以後,他會記錄main函數的返回值,調用atexit註冊的函數,而後結束進程。

       如何作到Main函數以前或main以後執行代呢,其實上面引用已經提到部分,使用全局變量和atexit函數。

 

16. 異常,運行異常和編譯異常的區別,本質緣由是什麼

linux下的異常機制有中斷,陷入,故障和終止。

 

17. linux命令 :sed awk head 怎麼用

       more功能相似 cat ,cat命令是整個文件的內容從上到下顯示在屏幕上。 more會以一頁一頁的顯示方便使用者逐頁閱讀,而最基本的指令就是按空白鍵(space)就往下一頁顯示,按 b 鍵就會往回(back)一頁顯示,並且還有搜尋字串的功能 。more命令從前向後讀取文件,所以在啓動時就加載整個文件。

       less 工具也是對文件或其它輸出進行分頁顯示的工具,應該說是linux正統查看文件內容的工具,功能極其強大。less 的用法比起 more 更加的有彈性。 在 more 的時候,咱們並無辦法向前面翻, 只能日後面看,但若使用了 less 時,就能夠使用 [pageup] [pagedown] 等按 鍵的功能來往前日後翻看文件,更容易用來查看一個文件的內容!除此以外,在 less 裏頭能夠擁有更多的搜索功能,不止能夠向下搜,也能夠向上搜。

       能夠經過head命令查看具體文件最初的幾行內容,該命令默認是前10行內容,若是你想查看前面更多內容,你能夠經過一個數字選項來設置,例如

head -20 install.log

 

STL的東西,有哪些有序的數據結構,底層是如何實現的。

聊了項目

nginx的負載均衡方式,上傳文件的大小限制

靜態變量和全局變量的分配方式和使用區別

野指針,智能指針,unique_ptr和shared_ptr的區別

如何追內存泄漏

多線程編程的互斥和同步

如何計算多線程server的併發

strcpy的實現和注意事項

gdb的底層實現原理

       gdb調試無論是本地調試仍是遠程調試,都是基於ptrace系統調用來實現的。ptrace系統調用提供了一種方法,讓父進程能夠觀察和控制其它進程的執行,檢查和改變其核心映像及寄存器。主要用來實現斷點調試和系統調用跟蹤。

long ptrace(enum __ptrace_request request, \

    pid_t pid,void *addr,void *data);

request參數的主要選項:

PTRACE_TRACEME由子進程調用,表示本進程將被其父進程跟蹤,交付給這個進程的全部信號,即便信號是忽略處理的(除SIGKILL以外),都將使其中止,父進程將經過wait()獲知這一狀況。

 

PTRACE_ATTACH attach到一個指定的進程,使其成爲當前進程跟蹤的子進程,而子進程的行爲等同於它進行了一次PTRACE_TRACEME操做。可是,須要注意的是,雖然當前進程成爲被跟蹤進程的父進程,可是子進程使用getppid()的到的仍將是其原始父進程的pid。

       這下子gdb的attach功能也就明朗了。當你在gdb中使用attach命令來跟蹤一個指定進程/線程的時候,gdb就自動成爲改進程的父進程,而被跟蹤的進程則使用了一次PTRACE_TRACEME,gdb也就瓜熟蒂落的接管了這個進程。

  gdb調試的實現都是創建在信號的基礎上的,在使用參數爲PTRACE_TRACEME或PTRACE_ATTACH的ptrace系統調用創建調試關係後,交付給目標程序的任何信號首先都會被gdb截獲。

  gdb能夠先行對信號進行相應處理,並根據信號的屬性決定是否要將信號交付給目標程序。

       gdb就是調用這個系統調用,而後經過一些參數來控制其餘進程的執行的。

       ptrace函數中request參數的一些主要選項:PTRACE_TRACEME: 表示本進程將被其父進程跟蹤,交付給這個進程的全部信號,即便信號是忽略處理的(除SIGKILL以外),都將使其中止,父進程將經過wait()獲知這一狀況

       這是什麼意思呢?咱們能夠結合到gdb上來看。若是在gdb中run一個程序,首先gdb會fork一個子進程,而後該子進程調用ptrace系統調用,參數就是PTRACE_TRACEME,而後調用一個exec執行程序。

       基本過程是這樣,細節上可能會有出入。須要注意的是,這個選項PTRACE_TRACEME是由子進程調用的而不是父進程

       如下選項都是由父進程調用:PTRACE_ATTACH:attach到一個指定的進程,使其成爲當前進程跟蹤的子進程,而子進程的行爲等同於它進行了一次PTRACE_TRACEME操做。可是,須要注意的是,雖然當前進程成爲被跟蹤進程的父進程,可是子進程使用getppid()的到的仍將是其原始父進程的pid。這下子gdb的attach功能也就明朗了。

       當你在gdb中使用attach命令來跟蹤一個指定進程/線程的時候,gdb就自動成爲改進程的父進程,而被跟蹤的進程則使用了一次PTRACE_TRACEME,gdb也就瓜熟蒂落的接管了這個進程。  PTRACE_CONT繼續運行以前中止的子進程。可同時向子進程交付指定的信號。這個選項呢,其實就至關於gdb中的continue命令。當你使用continue命令以後,一個被gdb中止的進程就能繼續執行下去,若是有信號,信號也會被交付給子進程。

       除了以上這幾個選項,ptrace還有不少其餘選項,能夠在linux下閱讀man手冊:man ptrace

       須要注意的另外一點是,使用gdb調試過多線程/進程的人應該都知道,當子進程遇到一個信號的時候,gdb就會截獲這個信號,並將子進程暫停下來。這是爲何呢?

       實際上,在使用參數爲PTRACE_TRACEME或PTRACE_ATTACH的ptrace系統調用創建調試關係以後,交付給目標程序的任何信號(除SIGKILL以外)都將被gdb先行截獲,或在遠程調試中被gdbserver截獲並通知gdb。gdb所以有機會對信號進行相應處理,並根據信號的屬性決定在繼續目標程序運行時是否將以前截獲的信號實際交付給目標程序。

vim的使用,快捷鍵啥的

正則表達式

除了二分還有哪些查找方法?

一億個url重複的問題【常規題】,說用hash分紅小文件,被問到怎麼分,具體怎麼hash

 

手寫算法:

1. strcpy

2. 最長公共子串

 

3. 不用>、<、if找出最大值的宏

    #define MAX(A,B) (((A)-(B))>>31 ? (B) : (A))   

4. 迪傑斯特拉算法

5. 求鏈表的中和最大的子串

6. 寫一個字典樹,數據結構本身定義,實現插入功能

7. N個有序的鏈表,將這些鏈表合併成一個有序的鏈表

8. 實現字符串分割,分割後每一個word都在一個字典中,返回true,不然返回false

9. unix路徑化簡

//實際上就是截取全部的不含有特殊標誌的字符串,而後對這個字符串進行比對。若是是..;若是是.;若是是簡單的字符串,那麼就放到向量vector裏面。

int main()

{

        string test;

        getline(cin,test);

        string path = test + "/";

        vector<string>temp_result;

        string result = "/";

        int j = 0;

        string temp;

        for (int i = 0; i<path.size(); ++i)

        {

            if (path[i] == '/')

            {

                temp = path.substr(j, i - j);

                j = i + 1;

                if (temp.size()>0)

                {

                    if (temp == "..")

                    {

                        if(!temp_result.empty())

                            temp_result.pop_back();

                    }

                    else if (temp == ".") {}

                    else { temp_result.push_back(temp); }

                }

             }

       }

       for (int i = 0; i < temp_result.size(); ++i)

            result +=(i==0)? temp_result[i]:("/"+ temp_result[i]);

       cout<<result<<endl;

    }

10. 求2個集合的並集交集差集,我寫出來,他問能不能在存儲方面進行優化,我說只保留交集和差集

11. 一個數組,每一個數字能夠乘2任意次,最後可否讓整個數組的數相等——【這題是用位移作嗎??】

12. 將二叉樹寫成鏈表,再算時間複雜度。

13. 給定字符串以及關鍵詞數組,返回高亮的字符串,注意關鍵詞有公共部分的狀況

14. 不用遞歸,深度遍歷一個對象,對象有name以及children數組兩個屬性

15. 一個先升再降的數組,找最大值

16. 手寫代碼:輸入一個字符串和一個整數k,將這個字符串每隔k字符,進行翻轉

17. 字符串解碼:4[c2[abd]]→字符串解碼:4[c2[abd]]->cabdabdcabdabdcabdabdcabdabd

string translation(string& str, int ind){

    if(ind == str.size()||str[ind] == ']'){

        return string();

    }

    int num = 0;

    while(str[ind]!='['){

        num = num*10+str[ind]-'0';

        ind++;

    }

    ind++;

    string tmpres;

    while(str[ind]>='a'&&str[ind]<='z'){

        tmpres+=str[ind];

        ind++;

    }

    cout<<tmpres<<endl;

    tmpres+=translation(str,ind);

    string res;

    for(int i = 0; i<num; i++){

        res+=tmpres;

    }

    return res;

}

18. 輸入一個數字組成的字符串,要求出全部可能的ip地址組合

【依然是深度遍歷】

void partitionIP(const string& str, int ind, string& tmpres, vector<string>& res, int partnum) {

       //幾個條件須要先知足一下

       if (str.size() - ind>(4 - partnum) * 3 || str.size() - ind<(4 - partnum)) {

              return;

       }

       if (ind == str.size() && partnum == 4) {

              string tt = tmpres.substr(0, tmpres.size() - 1);

              res.push_back(tt);

              return;

       }

       int num = 0;

       for (int i = ind; i<ind + 3&& i<str.size(); i++) {

              num = num * 10 + str[i] - '0';

              if (num <= 255) {

                     tmpres += str.substr(ind, i - ind + 1);

                     tmpres += '.';

                     partitionIP(str, i + 1, tmpres, res, partnum + 1);

                     tmpres = tmpres.substr(0, tmpres.size() - i + ind - 2);

              }

              if (num == 0) {

                     break;

              }

       }

}

19. 整型數組的最大字串

20. 寫一個代碼判斷元素出棧的順序是否合法

 

智力題:

燒繩子

25匹馬五條賽道選出前三甲,須要跑幾回——7

<step1>把25匹馬分爲五組進行比賽,每一組都按成績編號,1>2>3>4>5。可淘汰每一組的4,5,故如今還有15匹馬待選。 這樣已經比賽5次。  

<step2>把每一組的第一名挑選出來比賽,a1>b1>c1>d1>e1,則d,e組均可以淘汰。如今還有九匹馬待選。這樣已經比賽6次。 

<step3>

a123

b123

c123  

       由1和2中步驟知上表中a1必定最快,a2,b1可能能夠競爭第二名的位置,a3,b2,c1能夠競爭第三名,如此,其他的馬匹被淘汰。讓a2,b1,a3,b2,c1這5匹馬比賽便可肯定第二名,第三名。   這樣已經比賽7次。

 

開發一面

面試官小哥很年輕,很熱情,整場面試就像在探討問題同樣,涉及的知識點比較多。

1. 如何實現一個優先級隊列

2. 說說經常使用的排序算法

3. 鎖有哪些,做用是什麼

4. Linux進程與線程通訊機制

5. Linux下緩存機制

1)緩存機制介紹

       在Linux系統中,爲了提升文件系統性能,內核利用一部分物理內存分配出緩衝區,用於緩存系統操做和數據文件。當內核收到讀寫的請求時,內核先去緩存區找是否有請求的數據,有就直接返回,若是沒有則經過驅動程序直接操做磁盤。

       緩存機制優勢:減小系統調用次數,下降CPU上下文切換和磁盤訪問頻率。

       CPU上下文切換:CPU給每一個進程必定的服務時間,當時間片用完後,內核從正在運行的進程中收回處理器,同時把進程當前運行狀態保存下來,而後加載下一個任務,這個過程叫作上下文切換。實質上就是被終止運行進程與待運行進程的進程切換。

3)緩存區分buffers和cached區別

可用的memory=free memory+buffers+cached

buffers Buffer Cache和cached Page Cache 磁盤緩存的大小

-buffers/cache 的內存數:used - buffers - cached

+buffers/cache 的內存數:free + buffers + cached

A buffer is something that has yet to be "written" to disk. A cache is something that has been "read" from the disk and stored for later use.

       緩存(cache)是把讀取過的數據保存起來,從新讀取時若命中(找到須要的數據)就不要去讀硬盤了,若沒有命中就讀硬盤。其中的數據會根據讀取頻率進行組織,把最頻繁讀取的內容放在最容易找到的位置,把再也不讀的內容不斷日後排,直至從中刪除。

       緩衝(buffers)是根據磁盤的讀寫設計的,把分散的寫操做集中進行,減小磁盤碎片和硬盤的反覆尋道,從而提升系統性能。linux有一個守護進程按期清空緩衝內容(即寫如磁盤),也能夠經過sync命令手動清空緩衝。

6. Linux的I/O模型

7. Linux內存模型

8. Linux內核態、用戶態、零拷貝

9. Socket鏈接過程

10. 你所知道的數據結構有哪些

11. STL容器內部數據結構

12. 紅黑樹的五種特性

13. 講解MapReduce模型

14. Redis中的ReHash方法

15. 大數據問題BitMap和Bloom filter

16. 關於C++,平時讀哪些書籍

17. 編程題:已知一個二叉樹,每一個節點有一個數值,用路徑值表示該路徑上全部節點值的和,求全局最大路徑值

 

開發二面

這一面是最難受的一面,上來就是三道算法題,別的什麼都沒問。

1. 已知一隨機發生器,產生0的機率是p,產生1的機率是1-p,如今要你構造一個發生器, 使得它構造0和1的機率均爲1/2

2. 有兩個排序數組,數組長度都爲n,二分法求第n、n+1大的數

3. 判斷鏈表是否有環,求入口位置,寫出最優解以及數學推導

       第一題就不會,心態炸了。當時的想法是設置一個全局計數器,第奇數次調用函數返回p,偶數次調用函數返回1-p,這樣在宏觀上看就是1/2。不過被說不符合題意。後面兩道題雖然會作,可是緊張的寫錯了不少地方,沒有達到二面要求。

       最後面試官說:從這兩道題看出你的過程化思惟很嚴重,沒有面向對象的編程思想,建議轉崗測試。好比第二題要處理兩個數組,能夠把二分查找部分封裝到一個函數裏,第三題雖然簡單,但要把原理完整推導出來。但願你們練習算法時不僅僅要會作,還要多手寫,把函數命名、封裝,算法的細節,數學推導都弄熟,不要輸在細節上。

【第二題的思路——查找兩個排序數組第n個數字】

       取A數組的中間元素mid1,取B數組的中間元素mid2,先比較這兩個元素的大小,若是這兩個元素相等,則直接返回A[mid1],若是A[mid1]<B[mid2],則mid1左側的元素能夠去掉,B數組右側的元素能夠去掉,這裏還要區分數組元素個數爲偶數奇數的狀況,若是元素個數爲偶數,則mid1元素也要去掉。若是A[mid1]<B[mid2]的狀況與此相似。時間複雜度爲O(logn)

int mid(int a[],int b[],int n)  { 

    int s1=0,e1=n-1; 

    int s2=0,e2=n-1; 

    int mid1=(s1+e1)/2; 

    int mid2=(s2+e2)/2; 

    while(s1!=e1||s2!=e2)      { 

        mid1=(s1+e1)/2; 

        mid2=(s2+e2)/2; 

        if(a[mid1]==b[mid2])          { 

            return a[mid1]; 

        } 

        if(a[mid1]<b[mid2])          { 

            if((s1+e1)%2==0)              { 

                s1=mid1; 

                e2=mid2; 

            } 

            else               { 

                s1=mid1+1; 

                e2=mid2; 

            } 

        } 

        else          { 

            if((s1+e1)%2==0)              { 

                e1=mid1; 

                s2=mid2; 

            } 

            else              { 

                e1=mid1; 

                s2=mid2+1; 

            } 

        } 

    } 

    return a[s1]<b[s2]?a[s1]:b[s2]; 

}

測試一面

原本心情極度鬱悶,可是跟面試官聊了一下子漸漸調整過來了,問了我對測試開發崗位的見解,給我介紹了職業前景等等。以後聊項目,把項目中遇到的兩個難點清晰的講解一下。

1. 寫一個字符串比較函數

2. 數組中亂序+、-兩種字符,把+置左,-置右

3. 若數組中還存在0,說說思路

4. C++內存模型、什麼是內存泄露

1. 概念:指因爲疏忽或錯誤形成程序未能釋放已經再也不使用的內存的狀況。內存泄漏並不是指內存在物理上的消失,而是應用程序分配某段內存後,因爲設計錯誤,失去了對該段內存的控制,於是形成了內存的浪費。

       內存泄漏是指你向系統申請分配內存進行使用(new),但是使用完了之後卻不歸還(delete),結果你申請到的那塊內存你本身也不能再訪問(也許你把它的地址給弄丟了),而系統也不能再次將它分配給須要的程序。

2. 對於C和C++這種沒有Garbage Collection 的語言來說,咱們主要關注兩種類型的內存泄漏

(1)堆內存泄漏(Heap leak。堆內存指的是程序運行中根據須要分配經過malloc,realloc new等從堆中分配的一塊內存,再是完成後必須經過調用對應的 free或者delete 刪掉。若是程序的設計的錯誤致使這部份內存沒有被釋放,那麼此後這塊內存將不會被使用,就會產生Heap Leak.

(2)系統資源泄露(Resource Leak.主要指程序使用系統分配的資源好比 Bitmap, handle, SOCKET沒有使用相應的函數釋放掉,致使系統資源的浪費,嚴重可致使系統效能下降,系統運行不穩定。 

3. 如何解決內存泄露?

       內存泄露的問題其困難在於1.編譯器不能發現這些問題。2.運行時才能捕獲到這些錯誤,這些錯誤沒有明顯的症狀,時隱時現。3.對於手機等終端開發用戶來講,尤其困難。下面從三個方面來解決內存泄露:

第一,良好的編碼習慣,儘可能在涉及內存的程序段,檢測出內存泄露。當程式穩定以後,在來檢測內存泄露時,無疑增長了排除的困難和複雜度。

使用了內存分配的函數,要記得要使用其想用的函數釋放掉,一旦使用完畢。

 

5. new、delete和malloc、free區別

6. STL線程安全與不安全

7. HashMap和HashTable區別

8. Python縮進、代碼塊如何定義

9. 黑盒測試和白盒測試區別

10. 假設搜索引擎只有一個文本框和按鈕,如何作測試

 

測試二面

二面是個大姐姐,這麼屢次技術面仍是頭一次遇到,很不容易。整場面試更多考察的是解決問題的思路、想法。

 

1. 什麼是Hadoop和MapReduce模型

2. 介紹Redis和AOF持久化

3. MySQL的兩種引擎區別

4. 有兩個表分別是<KB,KB>、<TB,KB>、<TB,TB>級別數據表,設計三種數據庫系統以完成Join操做

5. 已知兩個日期,求這兩個日期相隔多少天

6. 如何測試一個冰箱,想一分鐘再說

7. 有100個球(50紅50藍)和兩個袋子,把全部的球裝進袋子中,如何分配使得拿一個球爲紅球的機率最大

 

百度提早批(offered

一面(55+minutes)

1.Java的三個特性

2.Java的spring介紹一下

3.Aop怎麼實現的,寫一下源碼,動態代理和cglib

4.Java線程池介紹一下,裏面的重要參數

5.在58實習的項目說說

6.信息脫敏項目怎麼作的(我在這裏說了guava緩存技術)

7.介紹一下緩存guava的用法

8.說說用過的一些rpc框架

9.聊了聊虛擬化雲平臺(PS:只是聊了聊大概,我也只是看了看幾篇博客而已。。)

10.而後和我介紹了一下他們部門的各類業務和工做

 

二面(45+minutes):

這是我認爲最難受的面試

面試官基本沒問Java

1.計算機網絡和操做系統輪番轟炸

Tcp三次握手,爲何三次握手(這裏每一次面試官都要求詳細解釋,下同)

Tcp四次揮手,爲何四次揮手

2.Osi七層模型,每一層的做用

3.Tcp和osi的區別,osi和tcp誰出現的早呢?(面試官開了個玩笑)

4.爲何Tcp比osi用的普遍

5.DNS域名解析全過程,而且作詳細解釋

6.頁面調度算法

7.介紹一下LRU算法

先入先出,最佳置換算法,LRU,clock算法。

8.介紹一下內核態和用戶態的區別

  如上圖所示,從宏觀上來看,Linux操做系統的體系架構分爲用戶態和內核態(或者用戶空間和內核)。內核從本質上看是一種軟件——控制計算機的硬件資源,並提供上層應用程序運行的環境。用戶態即上層應用程序的活動空間,應用程序的執行必須依託於內核提供的資源,包括CPU資源、存儲資源、I/O資源等。爲了使上層應用可以訪問到這些資源,內核必須爲上層應用提供訪問的接口:即系統調用。

  系統調用是操做系統的最小功能單位,這些系統調用根據不一樣的應用場景能夠進行擴展和裁剪,如今各類版本的Unix實現都提供了不一樣數量的系統調用,如Linux的不一樣版本提供了240-260個系統調用,FreeBSD大約提供了320個(reference:UNIX環境高級編程)。良好的程序設計方法是:重視上層的業務邏輯操做,而儘量避免底層複雜的實現細節。庫函數正是爲了將程序員從複雜的細節中解脫出來而提出的一種有效方法。它實現對系統調用的封裝,將簡單的業務邏輯接口呈現給用戶,方便用戶調用,從這個角度上看,庫函數就像是組成漢字的「偏旁」。這樣的一種組成方式極大加強了程序設計的靈活性,對於簡單的操做,咱們能夠直接調用系統調用來訪問資源,如「人」,對於複雜操做,咱們藉助於庫函數來實現,如「仁」。顯然,這樣的庫函數依據不一樣的標準也能夠有不一樣的實現版本,如ISO C 標準庫,POSIX標準庫等。

  Shell是一個特殊的應用程序,俗稱命令行,本質上是一個命令解釋器,它下通系統調用,上通各類應用,一般充當着一種「膠水」的角色,來鏈接各個小功能程序,讓不一樣程序可以以一個清晰的接口協同工做,從而加強各個程序的功能。同時,Shell是可編程的,它能夠執行符合Shell語法的文本,這樣的文本稱爲Shell腳本,一般短短的幾行Shell腳本就能夠實現一個很是大的功能,緣由就是這些Shell語句一般都對系統調用作了一層封裝。爲了方便用戶和系統交互,通常,一個Shell對應一個終端,終端是一個硬件設備,呈現給用戶的是一個圖形化窗口。咱們能夠經過這個窗口輸入或者輸出文本。這個文本直接傳遞給shell進行分析解釋,而後執行。

總結一下,用戶態的應用程序能夠經過三種方式來訪問內核態的資源:

1)系統調用

2)庫函數

3)Shell腳本

  下圖是對上圖的一個細分結構,從這個圖上能夠更進一步對內核所作的事有一個「全景式」的印象。主要表現爲:向下控制硬件資源,向內管理操做系統資源:包括進程的調度和管理、內存的管理、文件系統的管理、設備驅動程序的管理以及網絡資源的管理向上則嚮應用程序提供系統調用的接口。從總體上來看,整個操做系統分爲兩層:用戶態和內核態,這種分層的架構極大地提升了資源管理的可擴展性和靈活性,並且方便用戶對資源的調用和集中式的管理,帶來必定的安全性。

9.說說docker,自動化構建平臺jenkins

10.項目最難受的地方是什麼(我挖了個坑,我說寫單測的時候,特別着急上線。。。結果又聊了聊單測)

11.本身設計一個電梯調度算法

12.你爲何會來百度呢?不想留在58麼?

13.你所瞭解的百度

14.提問環節(這是比較開放的環節,因此就不記錄了)

簡單的聊了聊天,而後告訴我若是經過了會有人兩天以內聯繫我(我自認爲答得並很差,因此也就沒再多問問題)

 

三面經理面(70+minutes):(果真很準時,次日就聯繫我了)

1.Java的三個特性

2.你爲何會學Java

3.gc算法(這地方只說了大概)

4.jvm的內存模型,哪些是線程共享的,哪些是私有的

5.Redis用過麼,爲何要學redis啊,怎麼作集羣

6.Redis的幾種數據類型,優先隊列的底層數據結構

       Redis集羣採用了P2P的模式,徹底去中心化。把全部的key分紅了2^16個slot。每一個redis實例只負責其中一部分slot。集羣中的全部信息(節點,端口,slot等)都經過節點之間按期的數據交換而更新。

       Redis客戶端能夠在任意一個實例上發出請求。若是所須要的數據不在該實例中,則經過重定向命令引導客戶端訪問所需實例。

【所謂的集羣方案,是指發送客戶端命令給哪一個實例???】

集羣方案一:(靜態的分片方案)

       把分片的邏輯放到Redis客戶端來實現,經過Redis客戶端預先定義好的路由規則,把對key的訪問轉發到不一樣Redis實例中。最後把返回結果聚集。

       好處是全部的邏輯都是可控的,不依賴於第三方分佈式中間件。缺點是,這是一種靜態的分片方案,須要增長或者減小Redis實例時,須要手工調整分片程序。

方案二:使用Redis代理。

 

redis集羣提供瞭如下兩個好處

一、將數據自動切分(split)到多個節點

二、當集羣中的某一個節點故障時,redis還能夠繼續處理客戶端的請求。

       一個 redis 集羣包含 16384 個哈希槽(hash slot),數據庫中的每一個數據都屬於這16384個哈希槽中的一個。集羣使用公式 CRC16(key) % 16384 來計算鍵 key 屬於哪一個槽。集羣中的每個節點負責處理一部分哈希槽。

集羣中的主從複製

       集羣中的每一個節點都有1個至N個複製品,其中一個爲主節點,其他的爲從節點,若是主節點下線了,集羣就會把這個主節點的一個從節點設置爲新的主節點,繼續工做。這樣集羣就不會由於一個主節點的下線而沒法正常工做

7.大學學過哪些課,印象最深的課程(我最難受的是回答了數據結構)噢,其實我想聽的是高數和線代(我一臉黑線。。)

8.那說說各類數據結構的特色。。

9.兩個棧實現隊列,說說思路

10.聊聊實習的項目

11.Guava緩存策略爲何要那麼設置(具體的設置我忘記了,在公司寫的,已通過去一個多月了)

聊聊人生

12.你從上學到如今最艱難的決定是什麼

13.成績排名多少?最好的時候考過多少名?爲何不考研呢

14.你的愛好是什麼呢(打籃球,特別熱愛打籃球)

15.職業規劃

16.隨後面試官詳細解釋了個人一些疑問和不足,本人也很感謝面試官,也肯定了本人將來的發展方向

其他的主觀問題忘記了。。能想起來的就這麼多了

 

百度一面:

1. 問基礎,C和c++的,好比char str1[]="abc",char str2[]="abc", str1和str2是否相等。

若是是char*呢?

2. 一個struct的大小,c++多態的實現,虛函數的實現原理等等,很簡單,秒殺。

3. 而後根據簡歷,看你會啥。問得很細,樓主是tcpip一些最基礎的東西和多線程的東西,很基礎,秒殺。

4. 還問了linux的一些東西,樓主不是很熟,就隨便問了幾句

5. 面試官而後出了2個算法題

一個是判斷一個int有多少個1

一個是複雜鏈表的深拷貝,也是秒殺,而後就過了。

 

百度二面:

很是難啊。。覺得掛了,來了以後問

1. STL熟悉麼,喜歡什麼容器。

2. 說到map,問map怎麼實現,紅黑樹,紅黑樹是啥,紅黑樹插入操做是怎麼樣的,當時就懵逼了。我說紅黑樹的插入太複雜了吧,我寫個AVL樹的插入吧,而後給我一個樹,讓我往裏面插數,反正就是左旋右旋啥的,沒問題。

3. 而後讓我寫個堆排序,沒寫出來,就寫了個思路。

4. 而後問數據庫和linux的shell編程,(學過,不熟,出個題,直接說不會。)

5. 面試官無語了,問我會啥,我說c++,數據結構,操做系統,網絡編程都還能夠吧。而後就問了

c++的基礎東西,問了STL源碼裏面有啥設計模式

其餘的設計模式有沒有接觸,這個答得七七八八。

6. 而後作題

(1)實現一個返回棧中最小數的函數,設計了一個 類,很簡單。

(2)而後最後問了一個,大數據,幾億個數據排序

 

百度三面:

1. 百度三面瞎聊吧,聊了聊畢設

2. 聊了聊圖像處理和圖形學的東西

3. 聊了聊人生和理想

4. 問了問快排的基本思想

5. 問單鏈表能用快排麼?我說不行,爲啥不行,一直問,最後問到不會爲止。

6. 最後問了一個蓄水池抽樣的問題,沒據說過,他說沒據說過更好,就說了問題,讓我本身想有啥思路,7. 而後他在旁邊提醒,最後基本說出來了,面試官感受通常,讓我滾了,也不知道過沒過,說流程走完了,後續看HR吧。。

 

一面:

一、寫算法,二叉樹按層遍歷,用雙向鏈表把節點連起來

二、一個無序天然數數列,給定一個數M,選取天然數數列中兩個數,其中他們的和是M,打印全部這樣的天然數對

三、TCP UDP的不一樣 TCP三次握手

四、設計一個汽車搖號系統,當一我的搖了6年後抽到的機率會翻倍,設計這樣的系統

五、Linux命令 在一個文件中,倒序打印第二行前100個大寫字母

 

二面:

一、static_cast reinterpret_cast區別

二、class A{int m;}

class B{int m;}

class C:A,B;

C c;

printf("%p %p %p\r\n", &c, reinterpret_cast<B*>(&c), static_cast<B*>(&c)),三個結果打印有啥不一樣。

三、char c = 255;

unsigned short b = c;

cout <<b << endl;輸出結果

四、繼承中析構函數最好爲虛函數爲何?

五、構造函數爲何不建議調用虛函數?

6、TCP UDP端口掃描的實現方式

7、TCP close_wait狀態

CLOSE_WAIT
       CLOSE_WAIT是被動關閉鏈接是造成的。根據TCP狀態機,服務器端收到客戶端發送的FIN,則按照TCP實現發送ACK,所以進入CLOSE_WAIT狀態。但若是服務器端不執行close(),就不能由CLOSE_WAIT遷移到LAST_ACK,則系統中會存在不少CLOSE_WAIT狀態的鏈接。此時,多是系統忙於處理讀、寫操做,而未將已收到FIN的鏈接,進行close。此時,recv/read已收到FIN的鏈接socket,會返回0。

若是服務器出了異常,百分之八九十都是下面兩種狀況:

1.服務器保持了大量TIME_WAIT狀態

2.服務器保持了大量CLOSE_WAIT狀態,簡單來講CLOSE_WAIT數目過大是因爲被動關閉鏈接處理不當致使的。

 

8、守護進程的概念,怎麼建立守護進程

1. 在後臺運行。
       爲避免掛起控制終端將Daemon放入後臺執行。方法是在進程中調用fork使父進程終止,讓Daemon在子進程中後臺執行。
if(pid=fork())
exit(0);//是父進程,結束父進程,子進程繼續
2. 脫離控制終端,登陸會話和進程組
       有必要先介紹一下Linux中的進程與控制終端,登陸會話和進程組之間的關係:進程屬於一個進程組,進程組號(GID)就是進程組長的進程號(PID)。登陸會話能夠包含多個進程組。這些進程組共享一個控制終端。這個控制終端一般是建立進程的登陸終端。
       控制終端,登陸會話和進程組一般是從父進程繼承下來的。咱們的目的就是要擺脫它們,使之不受它們的影響。方法是在第1點的基礎上,調用setsid()使進程成爲會話組長
setsid();
       說明:當進程是會話組長時setsid()調用失敗。但第一點已經保證進程不是會話組長。setsid()調用成功後,進程成爲新的會話組長和新的進程組長,並與原來的登陸會話和進程組脫離。因爲會話過程對控制終端的獨佔性,進程同時與控制終端脫離。
3. 禁止進程從新打開控制終端
       如今,進程已經成爲無終端的會話組長。但它能夠從新申請打開一個控制終端。能夠經過使進程再也不成爲會話組長來禁止進程從新打開控制終端:
if(pid=fork())
exit(0);//結束第一子進程,第二子進程繼續(第二子進程再也不是會話組長)
4. 關閉打開的文件描述符
       進程從建立它的父進程那裏繼承了打開的文件描述符。如不關閉,將會浪費系統資源,形成進程所在的文件系統沒法卸下以及引發沒法預料的錯誤。按以下方法關閉它們:
for(i=0;i 關閉打開的文件描述符close(i);>
5. 改變當前工做目錄
       進程活動時,其工做目錄所在的文件系統不能卸下。通常須要將工做目錄改變到根目錄。對於須要轉儲核心,寫運行日誌的進程將工做目錄改變到特定目錄如/tmpchdir("/")
6. 重設文件建立掩模
       進程從建立它的父進程那裏繼承了文件建立掩模。它可能修改守護進程所建立的文件的存取位。爲防止這一點,將文件建立掩模清除:umask(0);
7. 處理SIGCHLD信號
       處理SIGCHLD信號並非必須的。但對於某些進程,特別是服務器進程每每在請求到來時生成子進程處理請求。若是父進程不等待子進程結束,子進程將成爲殭屍進程(zombie)從而佔用系統資源。若是父進程等待子進程結束,將增長父進程的負擔,影響服務器進程的併發性能。在Linux下能夠簡單地將SIGCHLD信號的操做設爲SIG_IGN。
signal(SIGCHLD,SIG_IGN);
這樣,內核在子進程結束時不會產生殭屍進程。這一點與BSD4不一樣,BSD4下必須顯式等待子進程結束才能釋放殭屍進程。

 

9、線程間同步方式,條件變量

10、性能優化思路

11、手寫代碼 將一個數M轉換轉換成N進制

12、STL 內存分配方式

13、迭代器++it,it++哪一個好

++i是在i上直接加1,表達式的值是i自己;

i++也是在i上加1,表達式的值是加1前的副本;

由於要存副本,因此效率略低,可是實際上大部分編譯器都會完成這部分優化工做,可是對於自定義的迭代器之類的,就未必有優化了;

 

14、二叉樹排序樹逆序打印

15、STL中仿函數有什麼用,和函數指針有什麼不一樣,哪一個效率高

【仿函數的一點整理——爲何要用仿函數?】

 STL的算法函數,能夠接受一個自定義的仿函數,包括函數指針。它的原型是:

template

Function for_each(InputIterator first, InputIterator end, Functin f);其中,Function是類型參數,(泛型)f能夠傳函數或函數指針或仿函數給它。

       f將做用於容器中的各個元素,故它必須有一個參數或多個參數,此外它還能夠有返回值。C++中根據仿函數的參數個數將它們分爲一元和二元兩類,同時又根據返回值是void或bool再進行分類。

       問題來了。仿函數能夠有多種類別,而STL某個特定算法函數,能接收的函數參數只能是其中的一種仿函數類別。如for_each只接受一元返回值爲void的仿函數,而sort要接受二元返回值爲bool的反函數。

       這樣就須要一種可以進行函數類型轉換的solution,它就是仿函數。例如:

bool tooBig(int n) { return n > 100; }

list scores;

...

scores.remove_if(tooBig);

以上代碼可以刪除list中大於100的數,門限是「100」。但若是用戶要指定門限,怎麼辦?修改tooBig函數?可是remove_if只接收一元的仿函數。

Solution:設計一個類,用類的成員變量來傳遞「門限」這個額外的信息。

template

class TooBig

{

private:

    T cutoff;

public:

    TooBig(const T & t) : cutoff(t) {}

    bool operator() (const T & v) { return v > cutoff; }

}

 

16、select和epoll區別,select爲何慢

17、fwrite write fread read fopen open 區別,可移植性哪一個好

18、多線程一個線程往一個數據中輸入一些數字,另外一個線程取出最大的兩個數,用什麼算法。【生產者消費者???】

19、堆的建立過程,怎麼將無序的數組轉換成一個堆

20、動態規劃的應用舉例

21、iptables的實現原理

22、快排是穩定排序嗎,舉個例子說明

 

 

1、自我介紹

2、項目經驗

3、class和struct的區別

4、inline函數的做用

5、虛函數和純虛函數的做用

6、純虛函數可否被實例化

7、類中哪些函數不可以被設置爲虛函數

8、可否用memset實例化一個類?

9、struct可否被繼承

10、口述已知前序遍歷和中序遍歷順序,求後序遍歷結果,並簡述過程

11、TCP三次握手的具體過程,爲啥不能是兩次或者四次

12、topK問題,求無序數組第k大的數字,算法的時間複雜度

13、new和malloc的區別

14、鏈表和數組的區別

 

 

二面

1、實驗室狀況,導師是否放人,實習時間可否保證

2、項目的一些細節問題

3、構造函數和析構函數可否爲虛函數,爲何?

4、對死鎖是否瞭解

4、OSI七層模型

5、TCP創建鏈接的具體過程

6、兩個鏈表可能有環,如何判斷是否相交

7、一個嚴格遞增的數組,判斷某個數是否存在的時間複雜度

8、假如數組不嚴格遞增呢

9、如何獲得數組中最大的前100個數,時間複雜度?

10、1G數據,現只有1M內存,如何獲得出現頻次最大的前100個數

11、除了堆排序、哈希,還有什麼別的方法

 

 

百度C++研發一面

1:指針(各類指針,指針數組,數組指針,函數指針,n級指針)

2:char *a=new

  char a[]

  sizeof(a)大小

3:靜態動態數組區別

4:new delete new[] delete [] malloc free底層實現

5:192.168.100.1  怎麼存儲

6:overload override(重載和覆蓋)

7:unsigned long* p1=(unsigned long* )0x810000(地址)

    unsigned char* p2=(unsigned char* )0x810000(地址)

p1+5=? p2+5=?

8:實現atoi(帶無效字符)

9:快排思想

10:1000萬個數,取出top100

    能夠堆實現和二分

11:兩個杯子+50個紅球+50個黑球,將100個球放入兩個杯子,保證取出紅球機率大的方法

12:tcp四次揮手過程

13:linux  select poll epoll

14:怎麼查看進程(ps aux

15:time命令

time命令 用於 打印出一條命令或一個程序的執行時間

time 命令以秒爲單位將一條命令執行期間所用的時間、系統時間和 time 命令的執行時間打印在標準錯誤中。

16:vim一些操做

       基本上vi能夠分爲三種狀態,分別是命令模式(command mode)、插入模式(Insert mode)和底行模式(last line mode),各模式的功能區分以下:

1) 命令行模式command mode)

       控制屏幕光標的移動,字符、字或行的刪除,移動複製某區段及進入Insert mode下,或者到 last line mode。

2) 插入模式(Insert mode)

       只有在Insert mode下,才能夠作文字輸入,按「ESC」鍵可回到命令行模式。

3) 底行模式(last line mode)

       將文件保存或退出vi,也能夠設置編輯環境,如尋找字符串、列出行號……等。

       不過通常咱們在使用時把vi簡化成兩個模式,就是將底行模式(last line mode)也算入命令行模式command mode)。

2、vi的基本操做

a) 進入vi

       在系統提示符號輸入vi及文件名稱後,就進入vi全屏幕編輯畫面:$ vi myfile。不過有一點要特別注意,就是您進入vi以後,是處於「命令行模式(command mode)」,您要切換到「插入模式(Insert mode)」纔可以輸入文字。初次使用vi的人都會想先用上下左右鍵移動光標,結果電腦一直嗶嗶叫,把本身氣個半死,因此進入vi後,先不要亂動,轉換到「插入模式(Insert mode)」再說吧!

b) 切換至插入模式(Insert mode)編輯文件

       在「命令行模式(command mode)」下按一下字母「i」就能夠進入「插入模式(Insert mode)」,這時候你就能夠開始輸入文字了。

c) Insert 的切換

       您目前處於「插入模式(Insert mode)」,您就只能一直輸入文字,若是您發現輸錯了字!想用光標鍵往回移動,將該字刪除,就要先按一下「ESC」鍵轉到「命令行模式(command mode)」再刪除文字。

d) 退出vi及保存文件

       在「命令行模式(command mode)」下,按一下「:」冒號鍵進入「Last line mode」,例如:

: w filename (輸入 「w filename」將文章以指定的文件名filename保存)

: wq (輸入「wq」,存盤並退出vi)

: q! (輸入q!, 不存盤強制退出vi)

3、命令行模式(command mode)功能鍵

1). 插入模式

按「i」切換進入插入模式「insert mode」,按「i」進入插入模式後是從光標當前位置開始輸入文件;

按「a」進入插入模式後,是從目前光標所在位置的下一個位置開始輸入文字;

按「o」進入插入模式後,是插入新的一行,從行首開始輸入文字。

2). 從插入模式切換爲命令行模式

按「ESC」鍵。

3). 移動光標

vi能夠直接用鍵盤上的光標來上下左右移動,但正規的vi是用小寫英文字母「h」、「j」、「k」、「l」,分別控制光標左、下、上、右移一格。

按「ctrl」+「b」:屏幕往「後」移動一頁。

按「ctrl」+「f」:屏幕往「前」移動一頁。

按「ctrl」+「u」:屏幕往「後」移動半頁。

按「ctrl」+「d」:屏幕往「前」移動半頁。

按數字「0」:移到文章的開頭。

按「G」:移動到文章的最後。

按「$」:移動到光標所在行的「行尾」。

按「^」:移動到光標所在行的「行首」

按「w」:光標跳到下個字的開頭

按「e」:光標跳到下個字的字尾

按「b」:光標回到上個字的開頭

按「#l」:光標移到該行的第#個位置,如:5l,56l。

4). 刪除文字

「x」:每按一次,刪除光標所在位置的「後面」一個字符。

「#x」:例如,「6x」表示刪除光標所在位置的「後面」6個字符。

「X」:大寫的X,每按一次,刪除光標所在位置的「前面」一個字符。

「#X」:例如,「20X」表示刪除光標所在位置的「前面」20個字符。

「dd」:刪除光標所在行。

「#dd」:從光標所在行開始刪除#行

5). 複製

「yw」:將光標所在之處到字尾的字符複製到緩衝區中。

「#yw」:複製#個字到緩衝區

「yy」:複製光標所在行到緩衝區。

「#yy」:例如,「6yy」表示拷貝從光標所在的該行「往下數」6行文字。

「p」:將緩衝區內的字符貼到光標所在位置。注意:全部與「y」有關的複製命令都必須與「p」配合才能完成複製與粘貼功能。

6). 替換

「r」:替換光標所在處的字符。

「R」:替換光標所到之處的字符,直到按下「ESC」鍵爲止。

7). 回覆上一次操做

「u」:若是您誤執行一個命令,能夠立刻按下「u」,回到上一個操做。按屢次「u」能夠執行屢次回覆。

8). 更改

「cw」:更改光標所在處的字到字尾處

「c#w」:例如,「c3w」表示更改3個字

9). 跳至指定的行

「ctrl」+「g」列出光標所在行的行號。

「#G」:例如,「15G」,表示移動光標至文章的第15行行首。

四、Last line mode下命令簡介

  在使用「last line mode」以前,請記住先按「ESC」鍵肯定您已經處於「command mode」下後,再按「:」冒號便可進入「last line mode」。

A) 列出行號

「set nu」:輸入「set nu」後,會在文件中的每一行前面列出行號。

B) 跳到文件中的某一行

「#」:「#」號表示一個數字,在冒號後輸入一個數字,再按回車鍵就會跳到該行了,如輸入數字15,再回車,就會跳到文章的第15行。

C) 查找字符

「/關鍵字」:先按「/」鍵,再輸入您想尋找的字符,若是第一次找的關鍵字不是您想要的,能夠一直按「n」會日後尋找到您要的關鍵字爲止。

「?關鍵字」:先按「?」鍵,再輸入您想尋找的字符,若是第一次找的關鍵字不是您想要的,能夠一直按「n」會往前尋找到您要的關鍵字爲止。

D) 保存文件

「w」:在冒號輸入字母「w」就能夠將文件保存起來。

E) 離開vi

「q」:按「q」就是退出,若是沒法離開vi,能夠在「q」後跟一個「!」強制離開vi。

「qw」:通常建議離開時,搭配「w」一塊兒使用,這樣在退出的時候還能夠保存文件。

17:gdb操做

18:大端小端問題,intel主機是什麼模式

19:32位平臺上內存對齊的問題

 

 

C++研發二面

1:爬蟲項目

2:守護進程,libevent

3:poll epoll select

4:爲何select有文件句柄限制,poll epoll沒有

5:網絡聊天項目

   聊天用什麼協議(UDP),問什麼使用UDP

   微信qq用什麼協議

6:跟多我的聊天怎麼實現的(多線程),多線程怎麼判斷和哪一個人聊天,須要設置什麼全局變量

7:這裏用到什麼IPC(文件映射)

8:進程線程區別聯繫,多線程多進程

9:多線程有什麼危險(加鎖)

   多線程中若是一個線程崩掉會不會形成整個進程的死亡

10:若是多線程一個線程沒有釋放鎖,會形成什麼狀況,

11:若是多線程一個線程沒有釋放鎖,那麼他和單線程相比是否就沒有優點了

12:TIME_WAIT狀態

13:長鏈接短鏈接

14:若是利用短鏈接,大量線程同事訪問服務器會產生什麼後果,若是短鏈接,一次發送了大量的數據會產生什麼後果

15:Hadoop,redis,大數據,雲計算了解不?(不瞭解)

16:線程裏面有什麼資源,都有什麼用處

(1)線程id(進程用這個來標記線程);(2)棧區域;(3)寄存器(PC寄存器,線程並行,調度切換);(4)信號屏蔽字;(5)errno;(6)優先級

 

17:若是一我的在公路上半小時遇到車的機率是0.9,那麼10分鐘以內遇到汽車的機率的是多少

18:二分圖問題,一個導遊安排一堆旅客住宿,每個旅客對每個房間有本身的滿意度,問怎麼安排房間保證全部遊客對導遊的滿意度最大(根據滿意度建邊,跑一邊二分圖匹配)

19:你有什麼問題

c++研發三面

聊理想,談感情,說故事

問個人博客記錄些什麼

最後問了點linux (進程線程,殭屍,守護,孤兒)   ,設計模式(單例模式懶漢餓漢,中介者模式) ,談ACM經歷

 

阿里巴巴 從3月底的一面斷斷續續到今天27號晚上已經進行了四面(我不知道爲何如今還在面試,正常應該結束了),不知道四面是否經過,

崗位也是c++研發

一面:

1:ACM經歷,你刷過多少題?大家團隊分工都是怎麼樣的?你最擅長哪些類算法?

2:topcoder,codeforge打了多少場,感受怎麼樣

3:單源最短路你會哪些。說一下,時間複雜度都是多少?

dijska,spfa

4:dij能優化不?(堆優化和優先隊列優化兩種)

5:給你個圖,已經源點和終點,問先從源點到終點,在從源點回到終點,最短路徑怎麼求?時間複雜度怎麼樣?

創建兩個對稱圖搜索+標記+剪枝

還有什麼方法?

跑一點最短路。另外一遍進行搜索判斷

6:vector內部元素內存不夠了,內部怎麼進行分配

7:mapset底層怎麼實現的?插入刪除複雜度怎麼樣

8:哈希表時間複雜度如何?衝突瞭如何解?

9:LRU模仿一下內部實現,實現insert函數(插入),get(得到頭部元素,可是也至關於對頭部進行查詢)?

最開始用O(N)靜態數組複雜度模擬兩個函數.

能優化不?用堆+map標記時間複雜度下降到log(n)

還能優化不?

get函數使用雙向循環鏈表,只是更改指針,時間複雜度降爲O<1>,insert沒想法優化到1了。最低logn

 

阿里二面:

找不到了記錄了,半個月前的了,可是我記得最後一個問題就是從一個棧中得到最大的元素(在線coding)藉助輔助棧

 

阿里三面:105分鐘

1:談一下信號量吧?

    ans:linux和windows的信號量都說了一下.

  說一下具體怎麼實現的?

說了一下怎麼具體實現的,我把函數都說出來了

  設計一個生產者消費者模型,經過queue,且有上限。

經過信號量設計了一下,順便把條件變量也能夠實現相似的功能說了一下

2:你對c++內存這裏有什麼看法,或者有什麼好的設計理念

本身總結了幾點,new,detele,new[],delete[],構造析購裏面一般怎麼設計,虛析購的概念

3:後來他又給我講解了一下c++喜歡用namespace這種機制,相似於析購構造的原理,一段結束後自動釋放的原理。

我接着也說了一下本身對namespace常常用到的地方(1)自動鎖的原理常常用到namespace,起到自動調用析購的函數(2)還有喜歡把一個class也封裝在一個namespace裏面,

4:設計的相似TCP的協議

(1)讓你設計一種協議,A,B兩個機器,A從硬盤不斷的讀數據流,並不斷的像B機器發送,而且是有序到達的,你怎麼保證B機器能夠有序的收到,而且能夠按順序的讀取?

我模仿TCP的滑動窗口+重傳機制設計了一下

(2)若是不是有序到達的,多個消息併發到達,亂序的,你怎麼處理?

在B機器對於收到的部分,咱們設定head和tail指針,而且放在確認報文裏面的首部選項裏,以便A端能夠重傳.

(3)若是假設,咱們每一次發送的數據,沒有序號的概念,也能夠理解爲序號不是連續的,可能1,3,5,12,111之類的,你怎麼處理?

我回答,從硬盤讀取的順序必定是必定的,那麼根據讀取的時間,咱們手動的設定一個序號。

(4)我不但願有相似於序號的這個概念,你又怎麼處理?

我回答的指針,從硬盤讀取的時候,咱們保證構造一個雙向鏈表的模型,咱們每次固定連續發送n個數據,B端收到後,對着n個暴力進行排序,讀取以後,在發送給A端一個確認的回覆,以後在循環進行

(5)我忘了他又怎麼問了,不知道本身回答的對不對,可是我都沒太明白他具體要實現什麼,他開始不讓用序號,最後他說了一下他的思路,好像仍是用到了序號的概念,跟我第三問好像差很少,總之比較亂

5:從n個數中取出k個怎麼實現?

堆時間複雜度n*logp

(1)可不能夠在優化?

我說若是數的大小上限的差若是小於p的話,能夠經過二分去解決,每次二分,看有多少個比mid大的數,感受這種想法確定不是他想要的,可是仍是說出來了

(2)若是說只去第k大的怎麼解決?

開始沒想到,他問了我一句,快排的原理你還懂不?我馬上知道他想怎麼實現了,以後立刻說出了思路,他說其實快排解決能夠將時間複雜度降爲0(n),其實我感受不是O(n),不知道他爲何這麼說

(3)在線coding你的代碼

下面是我在線10分鐘左右敲完給他看的代碼,其實過後我發現有幾個地方出錯了,當時coding沒注意到,無法調試。除了下面3個錯誤,應該沒有了,若是又發現的糾正意見

問題(1)l<r  這裏面應該是l<=r,具體的原理本身模擬一下就知道了,雖然快排這麼寫不影響,可是這裏影響

問題(2),(3):尼瑪,忘加上return,(ps:編碼必定不忘着急,犯這類低級錯誤)

return   getNum(arr,head+1,r,k);     //(2)        

return   getNum(arr,l,head-1,k-(r-head+1));//(3)

 

//coding

#include<stdio.h>

#include<string.h>

#include<iostream>

#include<algorithm>

using namespace std;

 

int getNum(int *arr,int l,int r,int k){

    int ans;

    if(l<r){   //(1)

        int head=l,tail=r,tmp=arr[l];

        while(head<tail){

            while(head<tail&&arr[tail]>=tmp){

                tail--;

            }

            if(head<tail){

                arr[head++]=arr[tail];

            }

            while(head<tail && arr[head]<tmp){

                head++;

            }

            if(head<tail){

                arr[tail--]=arr[head];

            }

        }

        arr[head]=tmp;

        if((r-head+1)==k){

            return arr[head];

        }

        else{

            if((r-head)>=k){

               getNum(arr,head+1,r,k);     //(2)

            }

            else{

               getNum(arr,l,head-1,k-(r-head+1));//(3)

            }

        }

    }

   

    return -1;

}

 

int main(){

    int len;

    int arr[10000];

    int k;

    cin>>len>>k;

    for(int i=0;i<len;i++){

        cin>>arr[i];

    }

    int ans=getNum(arr,0,len-1,k);

    if(ans==-1){

        cout<<"error"<<endl;

    }

    else{

        cout<<ans<<endl;

    }

    return 0;

}

6:討論了一下個人博客,告訴我必定要把這種習慣堅持下去。之後益處會很大。

7:你有什麼問題?

8:最後說建議你在多看一些更加深層的書籍,對你提升更加有幫助(我不知道這句話是否是意味着我三面失敗的意思,不懂),總之,很好

阿里雲四面

1 :字典樹的概念,插入和刪除須要注意些什麼

2:字典樹你有什麼優化的地方

3:一樣不少的字符串,你怎麼儘量少的壓縮空間去存儲,設計一種數據結構實現,不能使用字典樹

4:對於I/O你有什麼積累的經驗,對於read/write出錯了你有哪些解決的辦法?

5:異步+事務:對於一些異步事件,怎麼保證當調用失敗的時候保證總體的完整性?

6:你看過***源代碼麼(忘記了,本身沒聽過)

7:說一下你最近你感覺最深的項目吧(因爲正在***公司實習,參與了一個項目,,正好說了一下)

8:爲何想加入阿里?

9:你有什麼問個人嗎?

 

阿里巴巴,螞蟻金服(二面跪)

阿里巴巴跪了首先確實是由於本身能力不足,其次是由於本身做死投了JAVA崗(本人主要會C++)。

 

    一面:

    1.實習經歷

    2.說一下迪克斯特拉算法

    3.LinkedList和ArrayList區別

    4.B樹B+樹

    5.一致性哈希

    6.圖的的環檢測(深搜)

 

    7.對稱加密與非對稱加密

 

    8.還有些東西時間有些久遠不記得了

 

    二面:

    1.寫堆排序

    2.二叉樹先序遍歷(用遞歸和非遞歸)

    3.TCP三次握手,四次揮手

    4.說本身的項目,怎麼優化

 

結果GG

 

百度運維部(三面跪)

 

    一面

    1.TCP三次握手,以及爲何不是兩次或四次

    2.TCP四次揮手狀態,爲何要有time_wait,以及如何避免

    3.文件系統實現

    5.proc文件系統(meminfo,cpuinfo)

    6.Linux命令查看文件大小

    7.布隆過濾算法

    8.項目,如何改進

 

    二面

    1.全程談實習

    2.問了一個堆排序,而後堆得做用

 

    3.Topk

 

    4.將一個只含有1~n的亂序數組(不重複)的第一個數變成-1,求哪一個數被變成了-1

 

    問面試官我進去作的是運維仍是開發,被他教育了一番,但他說仍是給我過了

 

    三面

    1.輸入baidu.com是怎麼通訊的

    2.能不能來實習

    3.。。。剩下的不記得了,被虐了

 

結果GG,被本身菜醒。。。

 

好將來(拒offer)

 

    一面

    1.二叉樹高度(遞歸,非遞歸)

    2.一個數組只有一個數不重複,找出這個數。

    3.一個數組有兩個不重複,找出這兩個數

    4.寫一下堆排序

    5.虛函數實現機制

    6.一個硬幣,有A,和B兩人投幣,A先投,正面A贏,反面B繼續投,B投到正面算B贏不然A繼續投,這個規則持續下去求A贏得機率(等比數列公式忘了*_*)

    7.Java與C++區別

    8.怎麼學習的

 

    二面

    1.快排如何優化,快排與堆排優缺點

    2.設計一個類,...忘記了

    3.static做用

    4.講項目

    5.願不肯意轉算法方向

 

結果offer

 

美團 餐飲(offer)

 

    一面

    1.meituan.com通訊過程

    2.TCP三次握手,四次揮手,狀態

    3.虛擬內存機制

    4.缺頁操做系統如何處理

    5.什麼是elf頭文件

    6.寫快排,二分,單例

 

    7.volatile做用,內存屏障

 

    8.Java與C++區別(從模板,編譯,連接,內存,庫幾個方向解釋)

 

    二面

    1.給一個字符串數組和一個字符串S,找出字符串數組中全部的字符串s符合規則:s經過刪除,增長,替換一個字符能夠變爲S。

    2.簡單講講操做系統內存管理機制,段式與頁式內存管理的優缺點(順道講了下段頁式)

    3.知道sendfile嗎(表示不知道),啥是NIO(小白表示沒聽過。。。)

    4.RPC實現(答得很爛)

    5.講一下一個C文件的編譯連接過程

    6.B樹B+樹

    7.講實習,講本身的項目

    上來這個面試官就說前面的算法太簡單,來個稍微難點的第一題,(也不算難吧*_*。。。

 

    三面

    1.45度斜線打印二維數組

    2.講一下網絡通訊協議棧

    3.TCP和UDP區別,TCP如何保證可靠性,time_wait,TCP有哪些缺點

    4.HTTPS如何實現

 

    5.什麼是緩存,爲何須要緩存,有哪些緩存使用場景

 

    6.最近看了什麼講一下,講了一下GFS的核心和mapreduc

 

    4個瓶蓋換1瓶酒,要喝150瓶酒,他本身最少買多少瓶?

 

    8.聊了下人生

 

結果 offer

 

騰訊 SNG QQ音樂(拒offer)

 

    一面

    1.vector與list區別

    2.什麼是traits,做用

    3.迭代器失效

    4.unorderd_map如何實現

    5.模板兩種特化,做用(要求根據STL講,再配合traits說了下)

    6.說一下yacc和lex,遞歸降低

    7.tcp/ip...(這個答得都快吐了,參考前面

    8.深拷貝淺拷貝,右值引用,智能指針,引用計數,循環引用如何解決

 

    二面

    1.兩個排序數組合併成一個排序數組

 

    2.遊戲(農藥)用的TCP仍是UDP爲何

 

    3.Epoll與Select區別以及epoll優勢,爲何通常狀況下epoll性能比select好,ET模式與LT模式

 

    4.Epoll ET下非阻塞讀,爲何不能是阻塞

 

    5.發送3個80字節包,TCP與UDP下對端分別接受幾回(其實就是TCP與UDP區別之一,TCP基於流)

 

    6.實習,項目

 

    三面

 

    1.如何判斷一個數是2的次冪

 

    2.快排

 

    3.還有些不記得了,回答的不是很好

 

    4.談談理想啥的

 

百度雲計算事業部(offer)

 

    一面

 

    1.給一個先序序列,重構徹底二叉樹,若是是通常二叉樹能不能重構,爲何(QQ寫代碼_)

 

    2.有三個消息隊列,隨機的向三個隊列插入元素(機率可能不一樣),如何保證插入和查找的高效(有兩種思路,一種是加一個控制器,隊列通知佔用率,由控制器控制插入和查找,另外一種是計算阻塞次數,再根據阻塞次數按比例控制該隊列的插入頻率和查找頻率)

 

    3.最長公共子序列

 

    4.vector的拷貝,swap函數交換指針

 

    5.線程與進程區別,優缺點,進程內存模型

 

    6.IPC有哪些,共享內存原理

 

    7.說一下LRU cache思路

 

    8.賽馬問題,36匹馬,6個賽道,找出最快6匹馬的最小賽馬次數,若是是n匹馬,m個賽道呢

 

    二面

 

    1.虛函數實現機制

 

    2.內存模型影響因素(內存對齊,多重繼承下的內存模型,菱形問題,虛擬繼承內存模型,虛擬繼承是如何處理的)

 

    3.NRVO優化,右值引用

 

    4.extern C做用,爲何須要

 

    5.C++重載,name manging機制

 

    6.Epoll與Select區別以及epoll優勢,爲何通常狀況下epoll性能比select好,ET模式與LT模式

 

    7..如何用epoll實現高併發,多線程,線程池,線程驚羣問題

 

    8.二叉樹先序遍歷,遞歸,非遞歸,如何用O(1)空間實現(morris 遍歷)

    9.互斥鎖的實現原理(屏蔽中斷,CAS),讀寫鎖實現

 

    三面

 

    1.實習,項目

 

    2.TCP擁塞控制,滑動窗口協議,糊塗窗口

 

    3.虛擬內存機制,二級頁表,TLB快表,缺頁,swap

 

    4.操做系統調度算法

 

    5.TCP如何保證可靠性,四種定時器,time_wait如何解決,Nagle算法

 

    6.一致性算法(raft),一致性哈希

 

    7.優勢缺點,是否願意來實習

 

 

15分鐘寫一個判斷字符串是否爲合法字符串的方法

n個無符號整數找第k大,要求最壞O(n)時間複雜度,O(1)空間複雜度

static的特性

對於char,int這些怎麼實現sizeof

c 怎麼分配內存,若是分配不成功會發生什麼?怎麼處理?不捕獲異常能不能直接處理,提示強制轉換

c 內存分爲哪些區

大端小端

進程通訊方式

信號安全

io寫操做以後會馬上發出去嗎

畫三次握手四次揮手

Server端有兩個隊列,哪兩個

MTU,MSS是什麼

客戶端發送fin在c裏是哪一個函數

客戶端發送fin後若是還有消息未處理會發生什麼

客戶端什麼狀況會出現不少time_wait

 

 

 

2017微軟轉正實習生

    第一面沒問算法,直接問項目,首先我解釋了幾個課程設計,後來按着機器學習一直問。。沒怎麼回答好。。後來說了一下簡歷寫的個小遊戲。

    二面開始問我迷宮查找怎麼實現的,就是深度優先和廣度優先的搜索。問了倆算法,比較簡單:一個是樹的層序遍歷,另外一個求通過root的兩個樹節點之間的路徑長度。手寫代碼,講思路和測試用例。另外引伸了一下求兩個節點的不通過root的最短路徑長度。我說要求最近公共祖先,可是代碼還沒想出來咋寫呢,時間也差很少,就結束了二面。

    三面居然問一些語言特性。。java hashmap 和 hashtable的區別(線程安全)。。c++ virtual, 析構函數,重載重寫。按着線程安全的問題問啊問。。我就知道互斥鎖。。最後給看了一個c語言strtoken函數的定義,而後白板實現。自我感受這個函數寫的差很少,就是前面一些語言特性沒回答好。。 對了,由於strtoken 不是線程安全的,面試官又問我該咋辦。。我又只能回答說加鎖。。。。。。

 

微軟的消息等了過久了!!備胎一個月了,蘇州那邊打電話問我能不能去蘇州實習。。而後說不太能夠。。畢竟學校在北京。。而後GG了。。如今後悔,不應爲了怕導師而拒絕微軟啊,校招的時候仍是看實習的。 啊心塞。。。若是給我一個機會。。我確定會請一個月假加上暑假去的,沒實習如今校招特別難受,並且感受再也沒機會去微軟了。

 

小米實習面試

    1 最近公共祖先。 若是有parent 指針, 至關於求兩個鏈表的交點了。若是是普通二叉樹就遞歸判斷。 當初沒好好刷題呀。https://leetcode.com/problems/lowest-common-ancestor-of-a-binary-tree/description/

    2 旋轉數組二分查找

最後小米實習去了一週。迫於導師淫威, 怕怕地辭職了。太慫了。。並且等我辭職後居然放假了而且導師也對咱們找工做放水了!! 又心塞!!!

頭條實習面試

一面掛。 問求第k大個數字。用快排寫的。 寫的比較慢。 又問項目。感受沒亮點。 掛!

 

360中科院專場

面試真的靠緣分和運氣嗎,感受水過的。

    一面問,寫個atoi吧,考慮好各類狀況。 我就寫。。剛寫了兩分鐘,面試官忍不住了,你咋寫這麼多。。。我說我得考慮充分啊,他說別寫了講講吧。。。就講了下。而後又問,編輯距離知道嗎?我說動態規劃,剛要寫,而後他說好,知道了不用寫。而後問了下svm,gbdt 的東西, 就過了

    二面說,山東人啊。。360好多山東人呢。。哎你這項目都是工程的呀,咋來找算法,我說由於熱愛 = =(心裏:我就是試試看啊)。 沒寫算法題,聊了聊項目,問svm 摺頁損失公式,並問L2正則做用。居然過了(黑人問號??)

    三面hr: 自我介紹,優勢,對360的瞭解, 對人工智能研究院的瞭解。。。

 

百度本地鳳巢

    一面:因爲我簡歷寫的熟悉java, c++略懂,他就問了下簡單的c++的語言特性, const 關鍵字。面試官很nice,告訴我別緊張。。就想了解一下我會的東西。而後問了排序,按某種分類把排序算法分類一下。我按時間複雜度分的。後來又問了下各個排序的原理講了一下。 算法題:記不太清了,就是一個二叉樹遍歷的變形,輸出二叉樹中路徑尾節點能被5整除的路徑?寫了個遞歸的,又問非遞歸的。。大體說了下。他問,是否是刷題挺多。。我說,你們都會刷一些吧。。。問用linux開發嗎?我說寫過c/c++ makefile。 面試官就噼裏啪啦記錄。

    二面:shell 命令。。不熟, 問怎麼用shell腳本寫內存監控,直接說不會。 後來又讓我用shell查找統計一個文件裏的幾行記錄,我說我用sql吧。。。。面試官無奈地點頭了。後來問 linux 讀文件的時候內核發生了啥?而後問了selector, poll epoll... 當時都沒看(如今也沒來得及看~~(>_<)~~), 就記得selector 監控多個io通道啥的,大體說了下。 算法題: minstack. 參見劍指offer,可是第二個棧不用每次都push min

    三面:開放題。 問了搜索相關的。 問好多url,裏面可能有好多重讀字段怎麼存儲。開始說前綴樹,想了想,說先按照? / 分詞, 存儲倒排索引。面試官莫名以爲我不錯,但我本身感受二面三面答的都很差。

 

最後百度提早批只有這一個部門過了,剛剛筆試完,還沒收到通知。又是無盡的等待。。

百度金融

    一面 java 內存結構, 程序計數器存的啥?爲啥創建鏈接三次握手,而釋放鏈接要四次揮手?(把過程說了下,說四次揮手是由於服務器還要發數據給客戶端,發送完畢後還要肯定一次,不知道對不對)算法題:1)兩個字符串中,一個字符串相比另外一個字符串少了一個字符,找出來這個字符。 我說排序後用雙指針或者hash表,寫了代碼。2)算 a + b, 不能用加號或減號。說了用位運算,可是進位那裏卡殼了,正確答案見http://blog.csdn.net/unimen/article/details/6776138

int add(int num1, int num2)

{

    if (0 == num2)

        return num1;

 

    int sum = num1 ^ num2;

    int carry = (num1 & num2) << 1;

    return add(sum, carry);

}

 

3) 二叉樹中序遍歷,遞歸 非遞歸都寫了遍。。。

 

    二面, 問項目,而後看到我有個模擬挖礦(比特幣相關的東西)的小應用,和金融比較相關,就簡單介紹了下。覺得我懂區塊鏈之類的,然而並無。算法題!鏈表帶random指針深拷貝的問題!! 我居然忘記咋作了,一直在想不用hash表的那種算法,最後面試官提示能夠用額外的數據結構,就說了用hash表存原節點和新節點的關係。完整答案:http://www.cnblogs.com/chrischennx/archive/2014/10/15/4026101.html

 

    三面 人生理想,職業規劃,性格優勢。 而後說我不大自信。之後面試要自信

 

鏈家

 

5個筆試題,現場筆試後再面試。

 

    筆試

    1 數組中超過一半的數。 http://blog.csdn.net/lskyne/article/details/9360639

    2 括號是否是合法匹配, 用了個棧

    3 m個連續珠子有n個不一樣的顏色,求最小包含n個顏色的連續珠子長度 http://blog.csdn.net/zhccl/article/details/8044449

    4 一堆ip訪問記錄(ip, 時間),若是10分鐘內連續訪問超過1024次就是非法的,找出這些非法ip

    5 判斷循環依賴。(圖裏是否有環,應該是用拓撲排序)

 

    一面: 線程有沒有本身的獨立資源? 三次握手過程。 b+樹 data存在哪?(葉子節點),葉子節點有聯繫嗎?(有,鏈表相連的形式)爲啥?(方便遍歷,區間查找) 你以爲筆試題能答多少分?我說七八十吧,他說差很少。說他以爲沒啥問題了, 問了解鏈家嗎,我說。。租房賣房的吧。。。北京好多門頭店啊。。。最後又說鏈家技術不錯。。

 

    二面: 鄙視個人項目,以爲太簡單。。 哎, 我也知道啊。。我也很絕望啊。。。寫了個sql,問職業規劃,我說作搜索相關的吧。。他說鏈家沒有。。我說比較偏算法的研發吧,他說這說法好虛啊。。。最後說 嗯你等一下我考慮一下吧。。。而後過幾分鐘給我掛了。 感受職業規劃真的挺重要的,雖然以後不必定按本身說的作,但仍是要大體有個規劃,讓面試官以爲 你這我的是對本身負責的。 因此我職業規劃是什麼,我研究生上的這麼雜我也很絕望啊。。。。

 

網易有道

 

算法崗, 不match. 記得一個題大約是:

http://www.cnblogs.com/huangwei1024/archive/2012/09/28/min-len-substring.html

百度運維

 

數據庫索引 用了什麼數據結構, 和紅黑樹區別

hashMap 初始化多大, 何時從新擴容

兩個鏈表判斷是否有交點

翻轉字符串 in-place "how are you" 轉成 「you are how」

三次握手; 四次揮手何時是在 time-wait 狀態

http 協議組成部分

jvm 垃圾回收, cms 收集器

elatic search 索引合併?

線程 interrupted 是進入什麼狀態

讀寫鎖 : 讀寫鎖特色:

1)多個讀者能夠同時進行讀

2)寫者必須互斥(只容許一個寫者寫,也不能讀者寫者同時進行)

3)寫者優先於讀者(一旦有寫者,則後續讀者必須等待,喚醒時優先考慮寫者)

jvm OM 異常 一般是怎麼個狀況, 如何調優。。。

華爲優招

 

啥也沒問基本。。聊項目也有沒有引伸出一些知識點

祖龍娛樂

 

1 給一個java 程序,說出執行期間,jvm各個內存存儲數據的變化,包括各個變量存儲在哪,對象構造的過程,程序計數器,棧的壓棧返回過程。而後評價我答的不太具體,只是說了各個數據的存儲區域。

 

2 申請了不少 對象, 會出現什麼問題? 各個內存區域都有可能由於什麼而出現問題?

 

3 垃圾回收算法

說了eden和 survivor 後, 讓具體描述那個 8:1:1 怎麼複製回收的

 

4 判斷html 字符串是否合法, 給合法的標籤列表, 要合法不能不一樣的標籤相互交錯。

 

5 account (aid, money)

設計 addMoney, subMoney transMoney(Account a, int money) 的線程安全的算法。

我寫了以後,忘記考慮money的正負 是否溢出的狀況,把我鄙視一番。 還有轉帳的方法, 兩個對象都加鎖,會形成死鎖產生, 他問我咋辦,我說一次都申請了,寫的代碼成了整個串行的了。 最後纔想到 按順序申請,能夠每次先給id小的account對象加鎖, 然而他已經對我完全失望。其實感受一開始就對我沒抱但願的樣子。

頭條校招面試

 

    一面:

    (1)大文件100億個數字,求前m大的數

    (2)進程和線程區別,啥時候應該用多線程,啥時候用多進程。 線程的好處? 協程? <a href="http://www.cnblogs.com/lxmhhy/p/6041001.html" target="_blank">http://www.cnblogs.com/lxmhhy/p/6041001.html (3)索引爲什麼用b樹 不用二叉樹 </a><a href="http://database.51cto.com/art/201504/473322_all.htm" target="_blank">http://database.51cto.com/art/201504/473322_all.htm 索引很大須要存到磁盤,高度小了,須要的io操做少

    (4)兩個有序數組,求第k個數, 說了雙指針的作法,O(k), 面試官讓想更優的, 沒想出來。應該是用二分查找的方法。 </a><a href="http://bookshadow.com/weblog/2015/02/05/find-kth-smallest-element-in-the-union-of-two-sorted-arrays/" target="_blank">http://bookshadow.com/weblog/2015/02/05/find-kth-smallest-element-in-the-union-of-two-sorted-arrays/ (5) 看什麼技術類的書籍,講講jvm裏都講了啥。</a>

 

    二面:

    1

    2

    3

         

    面試官脾氣很好。。問了下數據庫事物隔離,一開始說不大瞭解,忽然想到以前看了髒讀,不可重複讀,幻讀。。說了以後面試官也沒深刻問。<a href="http://www.cnblogs.com/zhoujinyi/p/3437475.html" target="_blank">http://www.cnblogs.com/zhoujinyi/p/3437475.html 而後問mysql的一些問題,爲什麼通常不用select *, 要用select 須要的字段呢?嘗試回答了,不大對,面試官就解釋了一遍。。我忘了他講的啥了。。。好像以前還被問到 limit 分頁的數字大爲啥效率會變低。。數據庫不太瞭解。

    而後問一個shell, Ctrl+C 發生了啥。。我扯了一堆進程銷燬的過程。。結果面試官是說和信號量有關。。尷尬。。

    算法題。。面試官拿了倆題,讓我選,我一看。。最大連續子數組和。。。而後寫完了, 扯了一會,說。。你寫個二分查找吧。。我就迅速寫了個。。 他看了一眼。。而後結束了面試。。</a>

 

    三面 :

    問了jvm的, gc, 怎麼判斷對象存活。 volatile(兩個特性) sychronized:

     修飾一個類,其做用的範圍是synchronized後面括號括起來的部分, 做用的對象是這個類的全部對象。

      修飾一個方法,被修飾的方法稱爲同步方法,其做用的範圍是整個方法, 做用的對象是調用這個方法的對象;

      修改一個靜態的方法,其做用的範圍是整個靜態方法, 做用的對象是這個類的全部對象;

      修飾一個代碼塊,被修飾的代碼塊稱爲同步語句塊,其做用的範圍是大括號{}括起來的代碼, 做用的對象是調用這個代碼塊的對象; <a href="http://wiki.jikexueyuan.com/project/java-concurrency/synchronized.html" target="_blank">http://wiki.jikexueyuan.com/project/java-concurrency/synchronized.html 實現LRU O(1) 可是面試官描述得有問題,說使最近用次數最少的blabla..,我說你說的是LFU啊,不是LRU. 他說差很少!!??說了LRU的數據結構,他又說加過時時間怎麼整。。 我只能想到O(n)遍歷刪除的。

    後來寫了求樹中兩個子節點直接最長距離的。。差點沒寫上來。 一開始想對每一個節點求左右高度,有重複計算,後來寫代碼時,就想到在遞歸中能夠求一遍就行了。寫好了面試官問了下邊界狀況,檢查了下沒問題。。而後說今天面試結束了,平常提問環節。。 瞎問了點問題。。</a>

 

最後面頭條的感覺:感受面了假的頭條。。 頭條實習一面掛的陰影還在, 咋還能給我終面過了。。面試真是運氣+眼緣啊。。忐忑。。 hr說九月中下旬給通知,不必定給offer

小米內推

 

一面: 瞎扯項目, 算法題: 二維數組中,每一個元素有個數字,求某一個點到任意一點的sum和(只能向右或者向下) dp記錄到每一個點的sum。 第二個題, 求一個字符串,包含一個字符集的最短長度。網易有道一面題

 

二面: 項目,講了java 內存。進程線程。 26進制轉換。 一堆ip中,查找一個ip是否存在。

 

 

 

 

 

做者:狗頭獸

連接:https://www.nowcoder.com/discuss/48182?type=0&order=0&pos=94&page=1

來源:牛客網

 

騰訊暑期實習電面:

 

1.對windows中消息機制的理解。

 

2.SendMessage與PostMessage區別

 

3.GetMessage與PeekMessage區別

 

4.對C++多態的理解。

 

5.函數重載如何實現。

 

6.動態多態如何實現——虛函數表指針。

 

7.虛函數表有多少張。

 

8.public繼承與private繼承。

 

9.STL中vector與list的區別。

 

10.如何實現線程同步。

 

11.死鎖的條件。

12.如何安全結束一個線程。

 

騰訊電面:

1.實習中最大的收穫,遇到的困難。

 

2.遊戲中大量資源,如何提升文件的讀寫效率。

 

3.MMORPG遊戲使用的是TCP仍是UDP,如何解決UDP丟包問題,TCP的性能慢在哪。

 

4.項目中最有技術含量的點。

 

5.A*算法要點。

 

6.最近看什麼書。

 

7.lua爲何不用編譯就能夠執行

 

網易實習一面:

 

1.extern‘C’的做用

 

2.函數重載的實現,與返回值、函數名、類型數量、類型有關?若是形參爲const int與int能重載麼。

 

3.成員函數末尾帶const表示什麼,如何在const成員函數中改變數據成員。

 

4.虛函數指針是否確定佔據對象前幾個字節,在32,64位系統中多少字節?

 

5.虛函數表,如何訪問到虛函數表中的函數地址。

 

6.vector、list、deque。

 

7.vector初始時容量。

 

8.vector迭代器失效何時發生?

 

9.unordered_map是由什麼實現。

 

10.哈希表的衝突處理方法。

 

11.開鏈法的缺點。

 

12.紅黑樹爲什麼優於平衡二叉樹(AVL)?

 

13.C++四種轉換,static_cast與dynamic_cast用來進行父類子類轉換的區別。

 

14.多線程跟多進程的區別。

 

15.32位系統進程可佔有多少內存(4GB),64位呢?

 

16.TCP鏈接的四次揮手。

 

17.發送一個數據包的時候,seq與ack與包大小的關係。

 

18.發送數據包後網絡層發生了什麼?

 

19.TCP的異步方式原理。

 

20.cocos2d的垃圾回收機制

 

 

網易一面:

 

1.代碼測試:實現STL中的push_back

 

2.函數內static與函數外static

 

3.棧上對象與堆上對象比較

 

4.extern 「c」做用

 

5.含虛函數的類size of

 

6.deque模型

 

7.PeekMessage與GetMessage

 

8.模板template

 

9.VC++的Runtime Library設置的做用,沒用過,過

 

10.lua table如何計算數組與map長度

 

11.10萬個數據如何求多少個組合使得兩個數相加得12345

 

12.tcp、udp的步驟解析,bind,listen,accept各自的做用

 

13.tcp連續兩次send,會receive幾回

 

14.tcp發送消息,應用層如何肯定接受已經完整了

 

15.是否用過非阻塞的模型,用的是MFC類庫帶的,沒具體瞭解,過

 

16.如何爲stack實現max()函數,記錄stack最大值(《劍指offer》)

 

17.如何使cpu保持20%(《編程之美》)

 

網易二面:

 

1.自我介紹

 

2.講下項目

 

3.vector容積從1開始,push_back N個元素的時間複雜度。

 

4.爬蟲獲取10億個頁面數據,用什麼存儲;如何匹配多個關鍵字,匹配後不一樣的頁面數據有不一樣的相關值,用什麼存儲。

 

5.上億個url,十萬個服務器,如何存放,能迅速響應用戶請求。

 

6.最大子串和,時間複雜度

 

7.最大子矩陣和,時間複雜度

 

8.有沒考慮讀研

 

9.將來發展規劃

 

 

 

 

 

 

 

 

做者:會飛的魚_fly

連接:https://www.nowcoder.com/discuss/48218

來源:牛客網

 

崗位:測試開發

 

個人秋招已經接近尾聲了,目前拿到了滴滴,58,鏈家,電信it研發中心的offer,在等頭條、騰訊和百度的結果。秋招面了的公司除了這7家還有搜狐和美團,搜狐面試體驗很差,感受二面面試官不尊重我(不是壓力面,就是不尊重),因此我態度也不太好,面完hr說我那天的面試經過了,回去等通知,而後就沒有而後了。美團是內推免筆試的,遠程面了3輪技術面而後就沒消息了,說實話我回想了一下三輪面試基本沒什麼問題,該答的該寫的我都答的不錯,就是想不通哪一個環節出了問題。如今我就按我面試的順序跟你們分享一些面經和感悟吧。大多數面試我面完回來沒寫面經,由於感受太累了,因此只能大概的回憶一下。

 

1、鏈家(內推的,筆試完八月底去北京現場面,2輪技術+1輪hr)

 

鏈家是我秋招面試的第一家公司,專門跑了一趟北京現場面的,鏈家工做環境不錯,hr姐姐也很nice,面試官總體也還不錯,以前已經寫了面經,傳送門:https://www.nowcoder.com/discuss/35261。

 

 

2、58(內推筆試,2輪技術面+1輪hr面,視頻)

 

一面:45min,

 

沒有讓自我介紹,直接上問題

 

一、挑一個印象深入的項目,講一下遇到了什麼問題,如何解決的。

 

二、C++預編譯是什麼?作了哪些工做?

 

三、C++內存泄露

 

四、一個10G的文件,存放了用戶的訪問記錄(每次記錄佔1行),如何找出訪問頻率最高的前10個?

 

五、25匹馬,5個跑道,如何在最少的比賽次數內找出最快的三匹

 

六、Linux如何找出10天內修改過的文件

 

七、一個鏈表,若是找出最中間的結點(答了三種方法,最優的是用快慢指針)

 

八、數組和鏈表的區別

 

九、堆和棧的區別

 

十、數據庫瞭解嗎?平時用的什麼數據庫?(我說了解的很少,因此只問了一個問題)

 

十一、數據庫索引做用?有哪幾種

 

十二、SQL語句找出班級成績排名50-100的同窗姓名

 

1三、URL解析的全過程

 

1四、除了web服務器,還了解什麼服務器?(答了負載均衡服務器,讓我具體說了一下做用、負載均衡服務器用在剛纔說的URL解析的哪一個步驟、比較流行的負載均衡服務器有哪些)

 

1五、200個數存在數組裏,數字大小在1-100之內,如何找到出現頻率最高的一個,不能用輔助內存

 

1六、排序算法時間複雜度

 

1七、多線程同步互斥機制

 

1八、線程池做用

 

1九、哪些應用用到TCP,哪些是UDP

 

20、進程間通訊方式

 

面試難度還能夠,都是比較基礎平常的問題,沒有問測試的東西。

 

 

二面:30min

 

一、自我介紹

 

二、介紹兩個項目和論文,針對項目提了幾個問題

 

三、C++內存泄露了解嗎?如何避免?

 

四、測試的做用是什麼?

 

五、C++經常使用的數據結構有哪些?具體的應用場景?

 

六、HTTP協議瞭解嗎?HTTP報文格式?

 

七、Linux經常使用指令?ps命令的參數有哪些,含義

 

八、測試都要作哪些工做?回答的裏面有接口測試,又問了我接口測試是什麼?什麼是接口?

 

九、性能測試作什麼工做?

 

答了壓力、負載等,又問了壓力測試怎麼作?我舉例說好比模擬1000個用戶併發登陸;又問我如何用C++代碼實現這

 

1000個用戶的併發,我說用多線程編程,結合線程池;他說若是不用線程池呢,沒想出來(後來問了他這個問題怎麼搞,

 

他說試題答案不方便同步,巴拉巴拉的,我猜是他也不知道答案)

 

十、如何啓動線程?

 

十一、設計測試用例,如何測試優酷視頻客戶端

 

十二、哈希衝突處理方式

 

1三、有什麼問題要問他

 

hr面:20min

 

hr面常問的一些套路問題。。。

 

3、美團(內推免筆試,3輪技術面,1面3面是電話面,2面牛客網視頻面)

 

一面:1h10min

 

一、自我介紹

 

二、輸入URL的具體響應過程

 

三、剛纔講述的URL過程涉及到哪些協議,具體講一下相關的協議內容(DNS,TCP/IP,HTTP,ARP)

 

四、HTTP經常使用的方法有哪些?POST和GRT區別?

 

五、session和cookie的理解?

 

六、瞭解SYN包嗎?講一下具體應用(講了TCP三次握手過程,主動講了TCP超時計時器能夠保證可靠傳輸,又問了 TCP還有什麼保證可靠傳輸的機制,握手+擁塞控制)

 

七、SYN Flood瞭解嗎?具體解釋一下現象和緣由,解決方法

 

八、socket編程過程(服務器+客戶端,結合三次握手講了一下)

 

九、智力題:一個圓桌,AB兩我的放硬幣,A先放,先放不下的人輸,A如何放才能保證贏

 

十、智力題:8個球,1個球比其餘7個重,如何用一個天平秤2次找出重的球

 

十一、簡歷寫了學習了JMeter,主要學習了什麼,用它作了什麼,如何用它作性能測試

 

十二、C++編譯連接的全過程(預處理+編譯+彙編+連接)

 

1三、靜態連接和動態連接區別?

 

1四、靜態庫和動態庫後綴?(答了.lib和.dll,她說你說的是windows下面的嗎,我說是的。不過我也不知道linux下的啊。。)

 

1五、靜態連接的時候顯示undefined reference to的緣由有哪些

 

1六、C++虛繼承的做用

 

1七、C++智能指針

 

1八、C++ define和const區別?

 

1九、C++ static成員函數和成員變量是什麼?何時須要用到靜態成員變量?

 

20、C++ 深拷貝和淺拷貝

 

2一、STL瞭解哪些?(講了vector、list等,讓我講了區別,vector的底層實現機制)

 

2二、寫了兩個數據庫SQL查詢語句,比較簡單

 

2三、Linux用過嗎?查看當前目錄指令?

 

2四、查看進程指令?(答了ps,又讓講了ps的參數和做用)

 

2五、查找某個文件後100行中子串word出現的行

 

2六、功能測試包括哪些方面的測試?

 

2七、功能測試有哪些方法(答了等價類,邊界值,因果圖,讓解釋了一下等價類)

 

2八、測試電梯,設計測試用例

二面(40min)

 

 

一、自我介紹

 

而後直接寫代碼,比較簡單,牛客能夠在線調試

 

第一題:字符串反轉

 

第二題:二叉樹反序列化+中序遍歷

 

寫完代碼還沒來得及調試就讓先講思路,而後就結束了。。。

三面(經理面,30min)

 

1.自我介紹

 

2.項目負責的模塊佔整個項目的百分之多少

 

3.負責的模塊難點在哪

 

4.團隊中和別的同窗發生過意見不合的狀況嗎?如何解決的?

 

5.進程線程區別

 

6.進程的狀態和轉換條件?

 

7.輸入一個網址後跳轉到目標網頁過程當中用了哪些協議?DNS解析分類?ARP解析過程?

 

8.建立進程用到了哪些函數?答了fork,vfork,問了這倆區別

 

9.對測試的見解?講了測試具體要承擔的職業,讓繼續說,又說了測試須要具有的能力,還讓繼續,又說了測試和開發溝通的問題

 

10.爲何作測試?怎麼學習測試的?學習了哪些東西?

 

11.設計測試用例的方法?

 

12.測試用例要素

 

13.能夠實習嗎?具體時間?

 

14.家是哪的?父母對我去北京工做的見解?

 

15.手裏有哪些offer?美團和這些offer之間我選擇哪一個?

 

16.單身嗎?

 

最後再吐槽一句,我不服,哈哈哈,由於美團是我最想去的公司,原本覺得挺穩的,結果就這麼莫名其妙掛了,還難過了一成天,後來他們來武漢面試的時候原本約了一個同窗跟他一塊兒去霸面的,結果前一天晚上百度約了3面,我就沒有去,面完百度回來我就不想去霸面了,此處不留爺自有留爺處,哈哈

 

4、滴滴(校招批筆試,現場3輪技術+1輪hr)

 

滴滴面完沒有寫面經,我就大概回憶一下。

 

一面:50min

 

一、自我介紹

 

二、介紹項目,問了項目的一些細節(主要考察語言表達能力和思惟清晰度)

 

三、針對項目設計測試用例

 

四、C++內存對齊,給了倆結構體例子讓我求出佔用內存大小

 

五、C++構造函數、拷貝構造函數和賦值運算符的應用,給了倆代碼讓我指出調用了哪一個構造函數

 

六、平衡二叉樹是什麼?給8min手寫平衡二叉樹代碼

 

忘了。。。

 

二面:40min

 

一、自我介紹

 

二、不用加減法交換兩個整數值

 

三、寫代碼:把hello world轉換爲world hello(劍指offer原題)

 

四、0號進程和1號進程

 

五、智力題:100塊錢買雞,公雞5塊,母雞2塊,小雞5毛,100塊錢所有花完的前提下給出全部購買方案

 

六、寫代碼:實現STL的auto函數

 

七、c++ volatile關鍵字的做用

 

忘了。。。

 

三面:40min

 

三面是總監面,主要講了項目,而後給了我一個實際的場景,讓我想辦法解決問題

 

HR面:20Min

 

繼續套路。。。而後我還被套進去了

 

5、頭條(內推筆試,3輪視頻技術面,hr面還沒捱到我)

 

依舊是靠回憶寫面經,哈哈哈

 

一面:40min

 

一、自我介紹

 

二、寫代碼:N個數,有2個數出現了1次,其餘數都是出現了1次,找出這2個數(劍指offer原題)

 

三、HTTPS瞭解嗎

 

四、將一個HTTP數據包升級爲HTTPS後,我如何設計測試用例

 

五、數據庫索引類型

 

六、數據庫刪除表數據操做,答了delete和trancate。刪除表操做?答了drop,而後問了這三個的區別

 

七、寫了一個sql查詢語句

 

八、TCP三次握手和四次揮手過程,揮手爲啥要4次

 

九、shell用過嗎?問了幾個指令,讓寫出殺死錯誤日誌中的進程的腳本代碼

 

忘了。。。

 

二面:40min

 

一、自我介紹

 

二、寫代碼:非遞歸實現二叉樹的鏡像

 

三、給了幾個數據庫的表,寫sql

 

忘了。。。

 

三面:50min

 

一、自我介紹

 

二、寫代碼:找出字符串中的駝峯字符(badcan,第一個a和第二個a就是駝峯),刪除駝峯之間的字符

 

三、HTTPS瞭解嗎

 

四、將一個HTTP數據包升級爲HTTPS後,我如何設計測試用例(-_-||拿的是同一套面試題嗎)

 

五、輸出www.baidu.com後,從數據包走向、協議和前端發生的一些事情等方面講一下

 

六、假設你是百度的工做人員,四川地區人民反應他們上不了百度主頁,你將從哪些方面排查?

 

忘了。。。

 

面完後hr打電話說面試經過,10月中選前hr面。

 

6、百度(秋招筆試,現場3輪技術面)

 

一面:50min

 

一、自我介紹

 

二、寫代碼:字符串最長上升子序列

 

三、針對剛纔的代碼設計測試用例

 

四、寫代碼:判斷鏈表是否有環

 

五、針對剛纔的代碼設計用例

 

六、給2個表,用sql的鏈接和嵌套兩種方式寫sql語句

 

七、測試電梯

 

忘了。。

 

二面:45min

 

一、自我介紹

 

二、寫代碼:實現memcpy函數

 

三、針對剛纔的代碼設計測試用例

 

四、寫代碼:字符串匹配的,具體不太記得了

 

五、針對剛纔的代碼設計測試用例

 

六、進程間通訊方式

 

七、TCP和UDP區別,應用場景

 

八、爲啥作側開?優點是啥?

 

忘了。。。

 

三面:50min

 

一、自我介紹

 

二、問了一些性格方面的問題,還有項目中遇到問題和衝突如何解決的

 

三、寫代碼:給了個實際場景,設計算法而後寫出來,不是很難,很快搞定,描述起來太麻煩我就不說了

 

四、10億本書,若是想知道某個單詞在哪些書中出現過,如何設計數據結構和算法?

 

五、測試兩部電梯

 

忘了。。

 

7、電信IT研發中心(筆試,現場2輪技術+1輪hr電面)

 

崗位後端開發

 

一面:

 

一、自我介紹

 

二、C++指針和引用區別

 

三、C++ static關鍵字

 

四、C++ const關鍵字

 

五、C++ 類中一個函數能夠同時用static和const修飾嗎

 

六、數據庫where和having區別

 

七、輸入一個網址後發生了什麼

 

八、HTTP包頭

 

九、HTTPS瞭解嗎

 

十、UML瞭解嗎

 

忘了。。。

 

二面:

 

一、自我介紹

 

二、C++ 編程的時候都須要注意哪些問題?

 

三、C++ 內存分配方式

 

四、項目

 

忘了。。。

 

8、騰訊(秋招筆試,現場2輪技術+1輪hr)

 

一面:40min

 

一、自我介紹

 

二、實現strcpy函數(以前看了源碼沒考慮內存重疊,因此我寫的時候也沒考慮,而後被懟-_-||)

 

三、OSI七層模型(忘記會話層和表示層具體幹嗎的了,大概按個人理解說了一下表示層做用)

 

四、瞭解jemter底層原理嗎?我說不了解,可是我能夠說說個人理解,而後說了一堆

 

五、爲啥作側開?優點?爲啥去深圳?諸如此類的一些問題

 

忘了。。。

 

一面是個leader,全程面無表情懟我,搞得我好緊張,可是我仍是全場面帶微笑扛下來了,結束的時候讓我問問題,原本以爲應該是掛了,可是出於禮貌仍是問了兩個問題。後來居然過了,汗。

 

二面:40min

 

一、自我介紹

 

二、寫代碼:快排。問了時間複雜度和穩定性

 

三、TCP握手流程

 

四、TIME WAIT瞭解嗎

 

五、TCP劫持瞭解嗎

 

六、上網的時候界面有時候會彈出廣告,你以爲是什麼緣由?

 

七、socket編程的流程

 

八、數據庫索引底層原理

 

忘了。。。

 

HR面:45min

騰訊的hr面感受快遇上某爲的面試了,性格、家庭、興趣愛好巴拉巴拉的全都問,都是套路,可是一不當心仍是會被套進去。

騰訊今年的面試很奇怪,面的很簡單,看了其餘搞後臺開發的同窗的面經感受也都挺基礎,這是要擴招?

 

 

關於測試&測試開發&開發

 

前段時間有個同窗問我投的都是什麼崗,我說側開,他說那你豈不是已經一堆offer了。。。我當時挺無語,感受搞開發的同窗特別看不起側開,感受側開就是給他們打雜的沒什麼技術含量。就我瞭解,百度的側開不只僅是開發測試工具和平臺,還要跟業務結合作一些開發的工做,其餘公司好像基本都是開發工具和腳本。在我面試的這些公司裏,基本都是以開發的標準在面側開,測試的東西反而比較少,代碼該寫的仍是要寫,算法該問的仍是要問,從編程語言,數據結構,數據庫,網絡到linux,我不以爲這些知識哪一項是側開能夠不掌握的,不知道有些看不起側開的同窗是什麼情節,側開的開發工做確實會比開發少一些,可是不管是面試仍是知識廣度深度上都不會亞於開發的。

 

對於測試工程師,主要是作功能測試,因此相對較輕鬆。

 

關於秋招準備

 

我讀研期間主要是作理論研究,今年三月份纔看完c++、數據結構和網絡,找實習的時候投的都是開發崗,奈何基礎太差,沒找到。七月份注意到測試開發這個崗位,分析了一下以爲更適合我,因此開始看了一些測試的書籍和視頻,自學了軟件測試工具jemeter,可是平時看書主要仍是按開發的要求在準備,刷題主要是劍指offer,在牛客刷了2遍,每次面試前我都會再過一遍。

 

關於內推or校招

 

就今年的形式來看,內推開始的特別早,不少人都參加了內推,估計內推就佔了不少坑,在準備的還能夠的前提下我建議參加內推,有的公司內推不過還能夠秋招,可是感受概率很小了。可是內推存在的問題是,開始的早,準備可能不夠充分,另外一方面,遠程面試的效果會比現場面差,因此如何取捨仍是要看本身。

 

關於面試套路

 

一、問到會的東西,必定要慢點說(雖然我到如今也沒學會,面試的時候老是會忘記這點),能夠適當拓展,把本身知道的相關的都說出來,把面試官往會的地方引,不要被牽着鼻子走,否則。。。你懂得。

 

二、遇到不會的,若是是偏底層的問題,你們瞭解的其實都很少,能夠跟面試官說說本身的理解,若是是表層的東西,不會的就直接說不會,不要瞎掰。

 

三、面試的時候必定要表現的自信!這點特別重要!有時候回答完面試官會反問確實是這樣嗎?這個時候若是比較肯定就必定要自信的說肯定!

 

四、面完讓問問題的時候必定要多問崗位相關的,顯得你好學!

 

五、hr面主要考察你的穩定性、積極性和性格,要當心一些,表現的積極主動樂觀一些,否則容易被套路,別問我爲何。。。

 

六、關於現場寫代碼,通常不會很難,基本都是劍指offer的題目,十分鐘之內能夠搞定,實在不會的,就按笨辦法寫,而後面試官會引導你的。還有須要注意的就是,想到一個方法,無論好很差,都要說出來,代表你在主動思考,拋磚引玉,面試官會繼續引導你的。

 

今天先寫到這,後期想到別的東西我會來補充,祝你們順利~~~

相關文章
相關標籤/搜索