螞蟻金服C++一二三面面經+HR+口頭offer確認,附解答

作者:fm

鏈接:nowcoder.com/discuss/71

來源:牛客網

樓主8號內推的螞蟻,29號面完所有流程,一二面隔的時間有點遠了,有些問題記不太清,這裡把能想到的都寫下來吧。

一面(1小時,P7)

前面10分鐘簡單聊了下研究方向。後面全程C++。

Q:主要語言是C++是吧,那我們先來考察一下C++的基礎。

A: 好的。

Q:C++里是怎麼定義常量的?常量存放在內存的哪個位置?

A:常量在C++里的定義就是一個top-level const加上對象類型,常量定義必須初始化。對於局部對象,常量存放在棧區,對於全局對象,常量存放在全局/靜態存儲區。對於字面值常量,常量存放在常量存儲區。

Q:你剛剛說到了const,const修飾成員函數的目的是什麼?

A:const修飾的成員函數表明函數調用不會對對象做出任何更改,事實上,如果確認不會對對象做更改,就應該為函數加上const限定,這樣無論const對象還是普通對象都可以調用該函數。

Q:那如果同時定義了兩個函數,一個帶const,一個不帶,會有問題嗎?

A:不會,這相當於函數的重載。

Q:C++ 類內可以定義引用數據成員嗎?

A:可以,必須通過成員函數初始化列表初始化。

Q:new/delete與malloc/free的區別是什麼?

A:首先,new/delete是C++的關鍵字,而malloc/free是C語言的庫函數,後者使用必須指明申請內存空間的大小,對於類類型的對象,後者不會調用構造函數和析構函數。

Q:你博客里提到了隱式類型轉換,能簡單說說嗎?

A:首先,對於內置類型,低精度的變數給高精度變數賦值會發生隱式類型轉換,其次,對於只存在單個參數的構造函數的對象構造來說,函數調用可以直接使用該參數傳入,編譯器會自動調用其構造函數生成臨時對象。

Q:如何避免?

A:explicit關鍵字。

Q:說說你了解的類型轉換。

A:C++類型轉換有四種。(這四種請大家自己去查)

Q:說說reinterpret_cast.

A: 這種是不常用的,可以用於任意類型的指針之間的轉換,對轉換的結果不做任何保證,可能被用於哈希(此處不確定)。

Q:說說dynamic_cast

A: 這種其實也是不被推薦使用的,更多使用static_cast,dynamic本身只能用於存在虛函數的父子關係的強制類型轉換,對於指針,轉換失敗則返回nullptr,對於引用,轉換失敗會拋出異常。

Q:說說const_cast

A:事實上的用途還是很普遍的。對於未定義const版本的成員函數,我們通常需要使用const_cast來去除const引用對象的const,完成函數調用。另外一種使用方式,結合static_cast,可以在非const版本的成員函數內添加const,調用完const版本的成員函數後,再使用const_cast去除const限定。

Q:說說你了解的RTTI.

A:運行時類型檢查,在C++層面主要體現在dynamic_cast和typeid.

Q:具體是怎麼實現的。

A:VS中虛函數表的-1位置存放了指向type_info的指針。對於存在虛函數的類型,typeid和dynamic_cast都會去查詢type_info.

Q:你剛剛提到虛函數表,具體是怎樣實現運行時多態的。

A:簡單來講,子類若重寫父類虛函數,虛函數表中,該函數的地址會被替換,對於存在虛函數的類的對象,在VS中,對象的對象模型的頭部存放指向虛函數表的指針,通過該機制實現多態。

Q:C++函數棧空間的最大值 ?

A:默認是1M,不過可以調整。

Q:extern 「C」 ?

A:C++調用C函數需要extern C,因為C語言沒有函數重載。

Q:設計模式了解嗎,介紹一下單例模式。

A:C++的實現有兩種,一種通過局部靜態變數,利用其只初始化一次的特點,返回對象。另外一種,則是定義全局的指針,getInstance判斷該指針是否為空,為空時才實例化對象。

Q:你說的第二種就是所謂的懶載入。現在有一個問題,如果並發訪問,該怎麼做。

A:使用鎖機制,防止多次訪問。

Q:你的鎖是鎖住所有的代碼嗎?

A:是。

Q:這樣會多次重複判斷是否為空,而每次都會加鎖,有什麼辦法改善?

A:可以這樣,第一次判斷為空不加鎖,若為空,再進行加鎖判斷是否為空,若為空則生成對象。

Q:你提到了鎖機制,那麼C++的鎖你知道幾種。

A:鎖包括互斥鎖,條件變數,自旋鎖和讀寫鎖(後兩個沒答出來)。

Q:說一說你用到的。

A:生產者消費者問題利用互斥鎖和條件變數可以很容易解決,條件變數這裡起到了替代信號量的作用。balabala。

Q:C++兩種map。

A:unordered_map(哈希表)和map(紅黑樹)。

Q:紅黑樹了解嗎?

A:只知道本質是一顆BST,插入O(logN)。

Q: 快排的時間複雜度最差是多少?

A:O(N2)

Q:什麼時候最差?

A:樞紐元左側元素都比樞紐元小(不確定)。

Q:穩定排序哪幾種?為什麼?

A:查課本吧,很簡單。

Q:聊聊計算機網路的內容吧,TCP三次握手是怎樣的?

A:這部分大家參考相關課本。

Q:為什麼兩次不可以?

A:伺服器端未收到客戶端的連接確認,因此必須三次。

Q:四次呢?

A:連接確認後第三次的握手已經包含了客戶端數據,不需要四次。

Q:TCP擁塞了解嗎。

A:沒看。(直接跳過了這部分)。

Q:死鎖產生的必要條件?

A: 四個必要條件。

Q:如何預防?

A:-請查書。

Q:最後幾個問題,你平時如何提升自己的,在語言方面?

A:一些經典的書籍,會認真去看,同時,也會看一些對語言新特性介紹的書籍,保持敏感。

Q:分別有哪些書?

A:C++ primer,經典的入門書,深入探索C++對象模型,幫助我很好的理解C++的對象模型。effective C++,經典的關於C++進階的使用經驗。effective modern C++:關於C++11/14新特性的深入探討。

Q:說說C++primer中你覺得感受最深刻的內容。

A:這本書是入門必讀,我感覺印象最深刻的就是C++ 11的新特性,比如自動類型推導,lambda,右值引用(這裡被打斷了)。

Q:現在在看哪些書?

A:正在看的是STL源碼剖析。

Q:我的問題問完了,你有什麼要問我的嗎?

A:對我的面試評價。(C++掌握程度很深)

一面確實太久遠了,可能有些東西想不起來。當時全程基本都是C++的內容,稍微穿插了別的領域的問題。

二面(P9)

二面非常戲劇性,對大多數人不適用,全程跟面試官討論了做的研究,面試時間15分鐘結束。

三面(P9 交叉)

三面的具體過程已經在另一篇帖子了。

傳送:nowcoder.com/discuss/70

HR面

HR面避免踩坑,主要是一些性格上的問題要小心,其它沒什麼。

OFFER確認:跟領導討論實習的工作內容和實習時間。

具體就是這些。樓主準備的內容大都是C++以及演算法,但最後面試的過程是基本沒有問到演算法,語言和研究經歷佔了很大一部分,總結就是一定要有自己特別擅長的一個方面去打動你的面試官。


推薦閱讀:

面試官問你之前都是做什麼工作的,這是什麼用意呢?
四項基本原則,讓面試官為你的機智點贊!
HR在公司的地位如何?HR的職責、價值是什麼?
乾貨 | 金融行業小組面、群面常用案例的四大框架及解題思路
去某家知名遊戲公司,面試遊戲運營的體驗

TAG:螞蟻金服浙江螞蟻小微金融服務集團有限公司 | 面試 | CC |