程序員面試筆試寶典
程序員(英文Programmer)是從事程序開發(fā)、維護(hù)的專業(yè)人員。一般將程序員分為程序設(shè)計(jì)人員和程序編碼人員,但兩者的界限并不非常清楚,特別是在中國。下面就由學(xué)習(xí)啦小編為大家介紹一下程序員面試筆試寶典的文章,歡迎閱讀。
程序員面試筆試寶典篇1
1.extern的作用
自己理解:應(yīng)該需要區(qū)分extern在C語言中和C++語言中的作用,C語言中extern聲明的函數(shù)和變量可以被該文件外部模塊引用,C++語言中除了該作用還可以聲明extern “C”聲明一段代碼編譯連接的方法為C語言的方法。
參考:其實(shí)extern的百度詞條解釋的很清楚,具體的也是跟我上面自己理解差別不是很大。
(a) extern是C/C++語言中聲明函數(shù)和全局變量作用范圍(可見性)的關(guān)鍵字,該關(guān)鍵字告訴編譯器,其聲明的函數(shù)和變量在本模塊或其他模塊中使用(通常,在模塊的頭文件中對(duì)本模塊提供給其它模塊引用的函數(shù)和全局變量以關(guān)鍵字extern聲明。)
(b) 被extern “C”修飾的變量和函數(shù)是按照C語言的方式編譯和鏈接的。(C語言不支持函數(shù)重載,所以函數(shù)的C++和C的編譯方式不同,這一句的作用就是實(shí)現(xiàn)C++和C及其他語言混合編程)
2.strstr()函數(shù)的作用
strstr()函數(shù)的原型一般為extern char * strstr(const char *src , const char *dest) , 其作用就是尋找目標(biāo)字符串在源字符串中第一次出現(xiàn)的位置。
3.windows線程優(yōu)先級(jí)問題( 進(jìn)程和線程的區(qū)別和聯(lián)系 )
我覺得這個(gè)概念可能面試、筆試的時(shí)候不是很適合,畢竟平臺(tái)相關(guān),大多數(shù)公司可能更多的傾向于linux開發(fā),這個(gè)問題更換為進(jìn)程和線程的區(qū)別更好,這個(gè)是筆試,面試常見的知識(shí)考查。
(a) 通常一個(gè)進(jìn)程可以包含若干個(gè)線程,它們可以利用進(jìn)程所擁有的資源。進(jìn)程是系統(tǒng)進(jìn)行資源分配和調(diào)度的一個(gè)獨(dú)立單位,線程是進(jìn)程的一個(gè)實(shí)體,是CPU調(diào)度和分派的基本單位,它是比進(jìn)程更小的能獨(dú)立運(yùn)行的基本單位。線程自己基本不擁有系統(tǒng)資源,只擁有一些在運(yùn)行中必不可少的資源(如程序計(jì)數(shù)器,一組寄存器和棧),線程可與同屬于一個(gè)進(jìn)程的其他線程共享進(jìn)程所擁有的全部資源。
線程和進(jìn)程區(qū)別歸納:
地址空間和其他資源:進(jìn)程間互相獨(dú)立,同一個(gè)進(jìn)程的各線程共享。
通信:進(jìn)程間通信IPC,線程間可以直接讀寫進(jìn)程序數(shù)據(jù)段(如全局變量)來進(jìn)行通信-需要進(jìn)行同步和互斥的輔助。
調(diào)度和切換:線程上下文切換比進(jìn)程上下文切換快速,高效。
多線程的OS中,進(jìn)程不是一個(gè)可執(zhí)行的實(shí)體。
4.多方法交換x與y的值
5.指針的自加與引用
6.前置++與后置++
前置++和后置++我覺得一個(gè)比較重要的問題是C++中重載兩個(gè)操作符的時(shí)候如何區(qū)別:區(qū)分前置和后置 函數(shù)的參數(shù)有一個(gè) (函數(shù)重載),后置++有一個(gè)(int)參數(shù)。
7.inline的作用
inline函數(shù)不像正常函數(shù)在調(diào)用時(shí)存在壓棧和call的操作,它會(huì)把程序代碼直接嵌入到調(diào)用代碼段中,也就是說使用inline函數(shù)會(huì)增大二進(jìn)制程序的體積,但是會(huì)使執(zhí)行速度加快。
同時(shí),編譯期間可以對(duì)參數(shù)進(jìn)行強(qiáng)類型的檢查,這是inline優(yōu)于宏的一個(gè)方面。
8.二維數(shù)組的表示
9.ifndef的作用
條件編譯的語法,一般情況下,源程序中所有的行都參加編譯。但是有時(shí)希望對(duì)其中一部分內(nèi)容只在滿足一定條件才進(jìn)行編譯,也就是對(duì)一部分內(nèi)容指定編譯的條件,這就是“條件編譯”。有時(shí),希望當(dāng)滿足某條件時(shí)對(duì)一組語句進(jìn)行編譯,而當(dāng)條件不滿足時(shí)則編譯另一組語句。
10.KMP算法
字符串匹配的高級(jí)算法
程序員面試筆試寶典篇2
1.函數(shù)調(diào)用方式
__cdecl 堆棧由調(diào)用者清除 參數(shù)從右至左的順序壓入堆棧內(nèi)
__stdcall 堆棧由被調(diào)用者清除 參數(shù)從右至左的順序壓入堆棧內(nèi)
__fastcall 堆棧由被調(diào)用者清除 部分參數(shù)保存在寄存器中,然后其他的壓入堆棧內(nèi)
thiscall(非關(guān)鍵字) 堆棧由被調(diào)用者清除 參數(shù)壓入堆棧內(nèi),this指針保存在ECX寄存器內(nèi)
2.重載函數(shù)
函數(shù)重載是指在同一作用域內(nèi),可以有一組具有相同函數(shù)名,不同參數(shù)列表的函數(shù),這組函數(shù)被稱為重載函數(shù)。不能利用返回類型進(jìn)行重載!類中函數(shù)const和非const可以進(jìn)行重載,其實(shí)原理是利用this指針的類型是const和非const進(jìn)行重載,其實(shí)原理就是參數(shù)類型不同,const指針orconst引用調(diào)用的為const版本的函數(shù)~更多函數(shù)重載的知識(shí)。
3.構(gòu)造函數(shù)和析構(gòu)函數(shù)
虛擬析構(gòu)函數(shù)的使用場景是指向父類的指針實(shí)則為子類指針,調(diào)用delete的時(shí)候使用虛擬析構(gòu)函數(shù),防止部分內(nèi)存泄露。
構(gòu)造函數(shù)不能聲明為虛擬函數(shù),因?yàn)閷?duì)象的虛擬函數(shù)表的指針其實(shí)是在構(gòu)造函數(shù)內(nèi)編譯器添加完成的代碼,所以在構(gòu)造函數(shù)執(zhí)行之前無法訪問到虛擬函數(shù)表的。
4.合并兩個(gè)有序鏈表
類似歸并排序,兩個(gè)指針歸并即可。
5.100億條記錄的文本文件,取出重復(fù)數(shù)最多的前10條
類似top k算法,無法全部讀入內(nèi)存的top k算法是利用容量為k的最大堆,達(dá)到線性時(shí)間的top k算法。
首先利用hash table預(yù)處理每個(gè)元素出現(xiàn)的次數(shù),然后利用次數(shù)執(zhí)行top k算法。
6.設(shè)計(jì)一個(gè)雙向鏈表,并且提供一個(gè)可根據(jù)值刪除元素的函數(shù)
STL中的list底層及為雙鏈表實(shí)現(xiàn)。
7.二叉樹的多種遍歷算法實(shí)現(xiàn)
8.有讀和寫的兩個(gè)線程和一個(gè)隊(duì)列,讀線程從隊(duì)列中讀數(shù)據(jù),寫線程往隊(duì)列中寫數(shù)據(jù)
生產(chǎn)者和消費(fèi)者模型:
使用信號(hào)燈和互斥量。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
|
semaphore mutex = 1; semaphore fillCount = 0; semaphore emptyCount = BUFFER_SIZE; procedure producer() { while ( true ) { item = produceItem(); down(emptyCount); down(mutex); putItemIntoBuffer(item); up(mutex); up(fillCount); } } procedure consumer() { while ( true ) { down(fillCount); down(mutex); item = removeItemFromBuffer(); up(mutex); up(emptyCount); consumeItem(item); } } |
不使用信號(hào)燈和互斥量。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
|
volatile unsigned int produceCount, consumeCount; TokenType buffer[BUFFER_SIZE]; void producer( void ) { while (1) { while (produceCount - consumeCount == BUFFER_SIZE) sched_yield(); // 緩沖區(qū)滿 buffer[produceCount % BUFFER_SIZE] = produceToken(); produceCount += 1; } } void consumer( void ) { while (1) { while (produceCount - consumeCount == 0) sched_yield(); // 緩沖區(qū)空 consumeToken( buffer[consumeCount % BUFFER_SIZE]); consumeCount += 1; } } |
9.stack,heap,memory-pool
10.TCP的流量控制和擁塞控制機(jī)制
TCP的流量控制就是讓發(fā)送方的發(fā)送速率不要太快,讓接收方來得及接收。利用滑動(dòng)窗口機(jī)制可以很方便的在TCP連接上實(shí)現(xiàn)對(duì)發(fā)送方的流量控制。TCP的窗口單位是字節(jié),不是報(bào)文段,發(fā)送方的發(fā)送窗口不能超過接收方給出的接收窗口的數(shù)值。
所謂的擁塞控制為防止過多的數(shù)據(jù)注入到網(wǎng)絡(luò)中,這樣可以使網(wǎng)絡(luò)中的路由器或鏈路不致過載。擁塞控制索要做的都有一個(gè)前提,就是網(wǎng)絡(luò)能承受現(xiàn)有的網(wǎng)絡(luò)負(fù)荷。流量控制往往指點(diǎn)對(duì)點(diǎn)通信量的控制,是一個(gè)端到端的問題。因特網(wǎng)建議標(biāo)準(zhǔn)RFC2581定義了進(jìn)行擁塞控制的四種算法,即慢開始(Slow-start),擁塞避免(Congestion Avoidance)快重傳(Fast Restrangsmit)和快回復(fù)(Fast Recovery)。
程序員面試筆試寶典篇3
1.寫一個(gè)函數(shù),返回一個(gè)字符串中只出現(xiàn)一次的第一個(gè)字符
目前想到的方法就是利用hash表記錄每個(gè)字符出現(xiàn)的次數(shù),然后兩次遍歷即可找到只出現(xiàn)一次的第一個(gè)字符。
2.求一個(gè)數(shù)組中第k大的數(shù)的位置
3.面向?qū)ο罄^承,多態(tài)問題,如多態(tài)的實(shí)現(xiàn)機(jī)制
虛擬函數(shù),指針and引用
4.內(nèi)聯(lián)函數(shù)什么時(shí)候不展開
在內(nèi)聯(lián)函數(shù)內(nèi)不允許用循環(huán)語句和開關(guān)語句。 如果內(nèi)聯(lián)函數(shù)有這些語句,則編譯將該函數(shù)視同普通函數(shù)那樣產(chǎn)生函數(shù)調(diào)用代碼,遞歸函數(shù)(自己調(diào)用自己的函數(shù))是不能被用來做內(nèi)聯(lián)函數(shù)的。內(nèi)聯(lián)函數(shù)只適合于只有1~5行的小函數(shù)。對(duì)一個(gè)含有許多語句的大函數(shù),函數(shù)調(diào)用和返回的開銷相對(duì)來說微不足道,所以也沒有必要用內(nèi)聯(lián)函數(shù)實(shí)現(xiàn)。
5.成員函數(shù)初始化列表有什么作用?什么必須在成員初始化列表中進(jìn)行初始化?
類的static變量在類的構(gòu)造函數(shù)前已進(jìn)行初始化!
類對(duì)象的構(gòu)造順序:
(a)分配內(nèi)存,調(diào)用構(gòu)造函數(shù)時(shí),隱式/顯式的初始化各數(shù)據(jù)成員(順序和類中聲明對(duì)象一致)。如果無成員初始化列表。隱式初始化階段按照聲明的順序依次調(diào)用所有基類的缺省構(gòu)造函數(shù),然后所有成員類對(duì)象的缺省構(gòu)造函數(shù)。
(b)進(jìn)入構(gòu)造函數(shù)執(zhí)行函數(shù)體內(nèi)語句,函數(shù)體內(nèi)的數(shù)據(jù)成員的設(shè)置被認(rèn)為賦值,而不是初始化。
所以,使用初始化列表的兩個(gè)情況:
1)必須使用初始化列表進(jìn)行初始化![1]數(shù)據(jù)成員為類對(duì)象并且該類對(duì)象僅提供帶參數(shù)的構(gòu)造函數(shù)[2]const修飾的數(shù)據(jù)成員[3]引用數(shù)據(jù)成員;
2)考慮效率的時(shí)候!因?yàn)槲蠢贸跏蓟斜矶窃跇?gòu)造函數(shù)體內(nèi)進(jìn)行賦值,則調(diào)用了缺省構(gòu)造函數(shù)和賦值運(yùn)算符操作。如果數(shù)據(jù)成員為自定義的類對(duì)象,則效率比直接利用構(gòu)造函數(shù)初始化低很多。
6.指針與引用的區(qū)別
相同點(diǎn):
都是地址的概念;指針指向一塊內(nèi)存,它的內(nèi)容是所指內(nèi)存的地址;而引用則是某塊內(nèi)存的別名。
不同點(diǎn):
指針是一個(gè)實(shí)體,而引用僅是個(gè)別名
引用只能并且必須在定義時(shí)被初始化一次,之后不可變(類似常量指針,引用自帶常量指針屬性);指針可變;
引用沒有const,指針有const,const的指針不能夠改變;(int & const refer 不存在,因?yàn)橐帽旧砭统跏蓟淮尾豢勺?,但是const int &refer是存在的,指引用所指向的值不可改變)
引用不能為空,指針可以為空
sizeof針對(duì)指針得到的是指針的大小,針對(duì)引用得到的是指向?qū)ο蟮拇笮?
指針的++操作和引用的++操作完全不同,指針為移動(dòng)指針地址,引用++操作作用于指向的對(duì)象;
引用是類型安全的,而指針不是類型安全的。
7.創(chuàng)建空類時(shí),哪些成員函數(shù)是系統(tǒng)默認(rèn)的?
構(gòu)造函數(shù),拷貝構(gòu)造,賦值函數(shù),析構(gòu)函數(shù),取址運(yùn)算符,const取址運(yùn)算符
8.有10W個(gè)IP段,這些IP段之間都不重合,隨便給定一個(gè)IP,求出屬于哪個(gè)IP段
9.網(wǎng)絡(luò)編程(網(wǎng)絡(luò)編程范式,非阻塞connect)
常見的IO模型有阻塞、非阻塞、IO多路復(fù)用、異步。