騰訊面試題總結 似乎是面試C 方向的 小巫總結
分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow
也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!
騰訊面試題總結,似乎是面試C++方向的(小巫總結)
這份面試題是我在網上收集到的,是C++的,本人是搞Java的,C++以前也稍微接觸過,在這裡我稍微總結一下這份面試題,供需要的人蔘考。
電話面試題目:
1. 非同步通訊和同步通訊的區別?同步通訊與非同步通訊區別:
1.同步通訊要求接收端時鐘頻率和傳送端時鐘頻率一致,傳送端傳送連續的位元流;非同步通訊時不要求接收端時鐘和傳送端時鐘同步,傳送端傳送完一個位元組後,可經過任意長的時間間隔再發送下一個位元組。
2.同步通訊效率高;非同步通訊效率較低。
3.同步通訊較複雜,雙方時鐘的允許誤差較小;非同步通訊簡單,雙方時鐘可允許一定誤差。
4.同步通訊可用於點對多點;非同步通訊只適用於點對點。
2. TCP協議的作用?三次握手是通過什麼方法來保證通訊雙方確認的正確?
TCP提供的可靠資料傳輸服務,是依靠接收端TCP軟體按序號對收到的資料分組進行逐一確認實現的。這個過程在TCP收發端開始通訊時,被稱為三次握手初始化。
三次握手過程:
第一次握手:建立連線時,客戶端傳送syn包(syn=j)到伺服器,並進入SYN_SEND狀態,等待伺服器確認;
第二次握手:伺服器收到syn包,必須確認客戶的SYN(ack=j+1),同時自己也傳送一個SYN包(syn=k),即SYN+ACK
第三次握手:客戶端收到伺服器的SYN+ACK包,向伺服器傳送確認包ACK(ack=k+1),此包傳送完畢,客戶端和伺服器進入ESTABLISHED狀態,完成三次握手。
3. 作業系統執行可執行程式時,記憶體分配是怎樣的?
一個由c/C++編譯的程式佔用的記憶體分為以下幾個部分
1、棧區(stack)—由編譯器自動分配釋放,存放函式的引數值,區域性變數的值等。其操作方式類似於資料結構中的棧。
2、堆區(heap)—一般由程式設計師分配釋放,若程式設計師不釋放,程式結束時可能由OS回收。注意它與資料結構中的堆是兩回事,分配方式倒是類似於連結串列,呵呵。
3、全域性區(靜態區)(static)—全域性變數和靜態變數的儲存是放在一塊的,初始化的全域性變數和靜態變數在一塊區域,未初始化的全域性變數和未初始化的靜態變數在相鄰的另一塊區域。 - 程式結束後有系統釋放
4、文字常量區 —常量字串就是放在這裡的。程式結束後由系統釋放
5、程式程式碼區(text)—存放函式體的二進位制程式碼。
4. 引用和多型的區別?
答:引用就是某一變數(目標)的一個別名,對引用的操作與對變數直接操作完全一樣。
多型是允許你將父物件設定成和它一個或更多的子物件相等的技術,賦值之後, 父物件就可以根據當前賦值給它的子物件的特性以不同的方式運作。簡單地說就是一句話,允許將子類型別的指標賦值給父型別的指標。多型在C++中是通過虛擬函式實現的。
5. 堆和棧的區別?
答:stack的空間由作業系統自動分配/釋放,heap上的空間需要手動分配/釋放
棧的空間有限,堆是很大的自由儲存區。
程式在編譯期對變數和函式分配記憶體都在棧上進行,且程式執行過程中函式呼叫引數的傳遞也在棧上進行。
6. 程序之間通訊的方式有哪些?
答:訊號、訊號量、訊息佇列、共享記憶體。
7. 面向物件的三個特徵,分別有什麼作用?
答:封裝:封裝,也就是把客觀事物封裝成抽象的類,並且類可以把自己的資料和方法只讓可信的類或者物件操作,對不可信的進行資訊隱藏。
繼承:繼承是指這樣一種能力:它可以使用現有類的所有功能,並在無需重新編寫原來的類的情況下對這些功能進行擴充套件
多型:多型性( polymorphisn )是允許你將父物件設定成為和一個或更多的他的子物件相等的技術,賦值之後,父物件就可以根據當前賦值給它的子物件的特性以不同的方式運作。簡單的說,就是一句話:允許將子類型別的指標賦值給父類型別的指標。
實現多型,有二種方式,覆蓋,過載。
8. 虛擬函式的實現機制
答:
9. 如何判斷一棵樹是平衡二叉樹
答:如果某二叉樹中任意結點的左右子樹的深度相差不超過1,那麼它就是一棵平衡二叉樹。
10.sizeof在計算變數所佔空間大小時採取的機制
答:
11.結構體struct和聯合體union的區別
答: 共用體
構造資料型別,也叫聯合體
用途:使幾個不同型別的變數共佔一段記憶體(相互覆蓋)
結構體是一種構造資料型別
用途:把不同型別的資料組合成一個整體-------自定義資料型別
Structure 與 Union主要有以下區別:
1. struct和union都是由多個不同的資料型別成員組成, 但在任何同一時刻, union中只存放了一個被選中的成員, 而struct的所有成員都存在。在struct中,各成員都佔有自己的記憶體空間,它們是同時存在的。一個struct變數的總長度等於所有成員長度之和。在Union中,所有成員不能同時佔用它的記憶體空間,它們不能同時存在。Union變數的長度等於最長的成員的長度。
2. 對於union的不同成員賦值, 將會對其它成員重寫, 原來成員的值就不存在了, 而對於struct的不同成員賦值是互不影響的。
12.目前效率最好的內部排序是什麼
答:歸併排序:最差、平均、最好都是O(nlog2n)
各種排序方法對比:
一面題目:(因為比別人多了一個電話面試,所以一面的問題不再只是純技術方面的)
1. 簡單自我介紹(主要講自己的特長、性格特點、優缺點)答:自己發揮吧這個。
2. 大學期間自己做過的最成功的一件事
答:我覺得自己在大學最成功的事就是參加了傳智播客在我們學校舉辦的第一屆軟體開發大賽,我自己從參賽到實現作品,最後獲得獎項的整個過程讓我都回味無窮。自己付出很多努力,那也是我學習Android做的第一個專案,整個過程自己遇到很多問題,都是自己慢慢的耐心地去解決的,最後也不枉費我花的心機,所以覺得這件事我做得蠻成功的。
3. 如果遇到一個以前完全沒接觸過的技術,會怎麼去學習
答:首先我會先去收集資料,看看這個技術需要些什麼,看如何怎麼讓自己快速入門。是否有視訊教程或者比較好的書籍能讓我對這個陌生的技術有比較好的認識的,如果有的話就制定相應的學習計劃。
4. 接下來的學習計劃是什麼
答:我接下來的學習計劃是專案驅動學習,先去了解最新的技術動態,學習把最新的技術整合到自己的專案當中去,在整合專案之前,我會嘗試去做相應的Demo去實現效果,學習它實現的原理和機制。
5. 覺得大學裡最難學的課程是什麼
答:演算法分析與設計
我覺得這門課比較難學的原因是這門課需要我們比較好的邏輯分析能力,或者要有比較好的數學功底才能學好。
6. 如何統計深圳市便利店的數目,說思路
答:說實在我沒啥思路。
7. 如果你一個人在一間偏僻且裝置簡陋的酒店,某天晚上很晚,你突然想吃燒烤,你會怎麼做?(旁邊沒有燒烤店,旅館也沒有工具,你住的地方離有燒烤店的地方很遠,而且你也不知道怎麼去,貿貿然出去可能會有危險,你會採取什麼方法讓自己可以安全地吃到燒烤)
答:自己想
8. 過載和覆蓋的區別是什麼
答:
1、方法的覆蓋是子類和父類之間的關係,是垂直關係;方法的過載是同一個類中方法之間的關係,是水平關係。
2、覆蓋只能由一個方法,或只能由一對方法產生關係;方法的過載是多個方法之間的關係。
3、覆蓋要求引數列表相同;過載要求引數列表不同。
4、覆蓋關係中,呼叫那個方法體,是根據物件的型別(物件對應儲存空間型別)來決定;過載關係,是根據呼叫時的實參表與形參表來選擇方法體的。
9.MySQL資料庫中,如何檢視一個表的表結構,如何檢視其主鍵(說出檢視的命令)
答:desc 表名
show fields from dbname;
10.資料庫的讀髒活存放資料庫的磁碟出現災難性事故,有什麼方法可以避免
答:使用併發控制技術的封鎖技術可以避免讀資料的不一致。
11. 現場手寫程式碼,實現一個雙向迴圈連結串列的增刪查操作
答:
typedef structDNode
{
ElemType data;
struct DNode *prior, *next;
}DNode, * DoubleList;
插入操作:
intDlinkIns(DoubleList L, int i, ElemType e)
{
DNode *s, *p;
s=(DNode*) malloc(sizeof(DNode));
if(s)
{
s->data = e;
s->prior =p->prior; p->prior->next = s;
s->next= p;p->prior=s;
return TRUE;
}
else
returnFALSE;
}
刪除操作:
intDlinkDel(DoubleList L, int i, ElemType *e)
{
DNode *p;
*e = p->data;
p->prior->next= p->next;
p->next->prior=p->prior;
free(p);
return TRUE;
}
二面題目:
1. 簡單自我介紹答:自由發揮。
2. C++和Java的區別,JVM是什麼,具體用來做什麼
答:我覺得C++與Java最大的區別是在於記憶體管理上,C++的記憶體管理是需要程式設計師自己控制的,自己開了需要自己去釋放。然而Java提供了JVM,JVM就是用來進行記憶體管理的,不需要程式設計師自己手動開關。
Java呢,摒棄了C++很多複雜的特性,比如指標、多繼承、操作符過載等等,相對來說Java的程式設計學習入門比較容易。
3. 影象處理中點陣圖BMP的格式是怎樣的(這個是針對我的影象識別專案來的)
答:這個不清楚,面試官會根據你的專案來問相關的問題,能準備的是好好複習自己所做過的專案。
4. Windows程式設計的知識點,如訊息機制,一個自定義訊息如何實現
答: 自定義訊息共分為3步驟:
1) 自定義訊息:#defineWM_MYMSGWM_USER+1
2) 在標頭檔案中宣告函式: afx_msg voidonMyMsg();
3) 在訊息對映中新增對應關係:
//BEGIN_MESSAGE_MAP(CDefMsgDemoDlg,CDialog)//END_MESSAGE_MAP()
ON_MESSAGE(WM_MYMSG,onMyMsg)
4)定義函式void onMyMsg();
核心即:函式原型、關聯訊息與訊息響應函式的巨集、函式實現。
5. 簡單介紹一下Java中的集合框架(有哪些類構成和包括哪些介面)
答:
集合框架:用來表示和操作的統一的架構,包含了實現集合的介面與類
由上圖可知,所有Collection是上級介面,介面List、Queue、Set介面都繼承與它
實現List介面的類有ArrayList、LinkList
實現Queue介面的類有LinkList
實現Set介面的類有HashSet、SortedSet
Map也是一個介面,實現它的類有HashMap、SortedMap
6. 如果是自己為一個類寫一個sizeof函式,應該考慮哪些問題
答:
7. 虛擬函式和虛繼承對於一個類求sizeof的影響有什麼差別
答:
8. 說一下為什麼覺得自己適合做開發
答:首先我對程式設計就有很大的興趣,興趣是最好的老師。我本人有較好的語言基礎並且具備去做開發的職業技能。我個人在平時學習工作中都比較耐心,有較好的抗壓能力,這是做開發必備的素質。興趣+能力+素質,我想這三點就能讓我可以認為自己適合做開發。
9. 求最大子串和,說思路
答:含義:從元素i開始,到元素j為止的所有的元素構成的子段有多個,這些子段中的子段和最大的那個。
那麼:
q 如果:b[j-1]>0, 那麼b[j]=b[j-1]+a[j]
q 如果:b[j-1]<=0,那麼b[j]=a[j]
這樣,顯然,我們要求的最大子段和,是b[j]陣列中最大的那個元素。
int MaxSubSum(int n, int *a)
{
int sum=0, b=0;
for (int i=1;i<=n; i++)
{
if (b>0) b+=a[i];
else b=a[i];
if (b>sum) sum=b;
}
return sum;
}
10. Linux後臺開發問題(表示沒接觸過,題目沒聽懂,囧)
答:不知道問什麼問題,無法總結