程式設計師面試筆試寶典
程式設計師***英文Programmer***是從事程式開發、維護的專業人員。一般將程式設計師分為程式設計人員和程式編碼人員,但兩者的界限並不非常清楚,特別是在中國。下面就由小編為大家介紹一下的文章,歡迎閱讀。
篇1
1.extern的作用
自己理解:應該需要區分extern在C語言中和C++語言中的作用,C語言中extern宣告的函式和變數可以被該檔案外部模組引用,C++語言中除了該作用還可以宣告extern “C”宣告一段程式碼編譯連線的方法為C語言的方法。
參考:其實extern的百度詞條解釋的很清楚,具體的也是跟我上面自己理解差別不是很大。
***a*** extern是C/C++語言中宣告函式和全域性變數作用範圍***可見性***的關鍵字,該關鍵字告訴編譯器,其宣告的函式和變數在本模組或其他模組中使用***通常,在模組的標頭檔案中對本模組提供給其它模組引用的函式和全域性變數以關鍵字extern宣告。***
***b*** 被extern “C”修飾的變數和函式是按照C語言的方式編譯和連結的。***C語言不支援函式過載,所以函式的C++和C的編譯方式不同,這一句的作用就是實現C++和C及其他語言混合程式設計***
2.strstr******函式的作用
strstr******函式的原型一般為extern char * strstr***const char *src , const char *dest*** , 其作用就是尋找目標字串在源字串中第一次出現的位置。
3.windows執行緒優先順序問題*** 程序和執行緒的區別和聯絡 ***
我覺得這個概念可能面試、筆試的時候不是很適合,畢竟平臺相關,大多數公司可能更多的傾向於linux開發,這個問題更換為程序和執行緒的區別更好,這個是筆試,面試常見的知識考查。
***a*** 通常一個程序可以包含若干個執行緒,它們可以利用程序所擁有的資源。程序是系統進行資源分配和排程的一個獨立單位,執行緒是程序的一個實體,是CPU排程和分派的基本單位,它是比程序更小的能獨立執行的基本單位。執行緒自己基本不擁有系統資源,只擁有一些在執行中必不可少的資源***如程式計數器,一組暫存器和棧***,執行緒可與同屬於一個程序的其他執行緒共享程序所擁有的全部資源。
執行緒和程序區別歸納:
地址空間和其他資源:程序間互相獨立,同一個程序的各執行緒共享。
通訊:程序間通訊IPC,執行緒間可以直接讀寫程序序資料段***如全域性變數***來進行通訊-需要進行同步和互斥的輔助。
排程和切換:執行緒上下文切換比程序上下文切換快速,高效。
多執行緒的OS中,程序不是一個可執行的實體。
4.多方法交換x與y的值
5.指標的自加與引用
6.前置++與後置++
前置++和後置++我覺得一個比較重要的問題是C++中過載兩個操作符的時候如何區別:區分前置和後置 函式的引數有一個 ***函式過載***,後置++有一個***int***引數。
7.inline的作用
inline函式不像正常函式在呼叫時存在壓棧和call的操作,它會把程式程式碼直接嵌入到呼叫程式碼段中,也就是說使用inline函式會增大二進位制程式的體積,但是會使執行速度加快。
同時,編譯期間可以對引數進行強型別的檢查,這是inline優於巨集的一個方面。
8.二維陣列的表示
9.ifndef的作用
條件編譯的語法,一般情況下,源程式中所有的行都參加編譯。但是有時希望對其中一部分內容只在滿足一定條件才進行編譯,也就是對一部分內容指定編譯的條件,這就是“條件編譯”。有時,希望當滿足某條件時對一組語句進行編譯,而當條件不滿足時則編譯另一組語句。
10.KMP演算法
字串匹配的高階演算法
篇2
1.函式呼叫方式
__cdecl 堆疊由呼叫者清除 引數從右至左的順序壓入堆疊內
__stdcall 堆疊由被呼叫者清除 引數從右至左的順序壓入堆疊內
__fastcall 堆疊由被呼叫者清除 部分引數儲存在暫存器中,然後其他的壓入堆疊內
thiscall***非關鍵字*** 堆疊由被呼叫者清除 引數壓入堆疊內,this指標儲存在ECX暫存器內
2.過載函式
函式過載是指在同一作用域內,可以有一組具有相同函式名,不同引數列表的函式,這組函式被稱為過載函式。不能利用返回型別進行過載!類中函式const和非const可以進行過載,其實原理是利用this指標的型別是const和非const進行過載,其實原理就是引數型別不同,const指標orconst引用呼叫的為const版本的函式~更多函式過載的知識。
3.建構函式和解構函式
虛擬解構函式的使用場景是指向父類的指標實則為子類指標,呼叫delete的時候使用虛擬解構函式,防止部分記憶體洩露。
建構函式不能宣告為虛擬函式,因為物件的虛擬函式表的指標其實是在建構函式內編譯器新增完成的程式碼,所以在建構函式執行之前無法訪問到虛擬函式表的。
4.合併兩個有序連結串列
類似歸併排序,兩個指標歸併即可。
5.100億條記錄的文字檔案,取出重複數最多的前10條
類似top k演算法,無法全部讀入記憶體的top k演算法是利用容量為k的最大堆,達到線性時間的top k演算法。
首先利用hash table預處理每個元素出現的次數,然後利用次數執行top k演算法。
6.設計一個雙向連結串列,並且提供一個可根據值刪除元素的函式
STL中的list底層及為雙鏈表實現。
7.二叉樹的多種遍歷演算法實現
8.有讀和寫的兩個執行緒和一個佇列,讀執行緒從佇列中讀資料,寫執行緒往佇列中寫資料
生產者和消費者模型:
使用訊號燈和互斥量。
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***;
}
}
|
不使用訊號燈和互斥量。
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******; //
緩衝區滿
buffer[produceCount
% BUFFER_SIZE] = produceToken******;
produceCount
+= 1;
}
}
void consumer*** void ***
{
while ***1***
{
while ***produceCount
- consumeCount == 0***
sched_yield******; //
緩衝區空
consumeToken***
buffer[consumeCount % BUFFER_SIZE]***;
consumeCount
+= 1;
}
}
|
9.stack,heap,memory-pool
10.TCP的流量控制和擁塞控制機制
TCP的流量控制就是讓傳送方的傳送速率不要太快,讓接收方來得及接收。利用滑動視窗機制可以很方便的在TCP連線上實現對傳送方的流量控制。TCP的視窗單位是位元組,不是報文段,傳送方的傳送視窗不能超過接收方給出的接收視窗的數值。
所謂的擁塞控制為防止過多的資料注入到網路中,這樣可以使網路中的路由器或鏈路不致過載。擁塞控制索要做的都有一個前提,就是網路能承受現有的網路負荷。流量控制往往指點對點通訊量的控制,是一個端到端的問題。因特網建議標準RFC2581定義了進行擁塞控制的四種演算法,即慢開始***Slow-start***,擁塞避免***Congestion Avoidance***快重傳***Fast Restrangsmit***和快回復***Fast Recovery***。
篇3
1.寫一個函式,返回一個字串中只出現一次的第一個字元
目前想到的方法就是利用hash表記錄每個字元出現的次數,然後兩次遍歷即可找到只出現一次的第一個字元。
2.求一個數組中第k大的數的位置
3.面向物件繼承,多型問題,如多型的實現機制
虛擬函式,指標and引用
4.行內函數什麼時候不展開
在行內函數內不允許用迴圈語句和開關語句。 如果行內函數有這些語句,則編譯將該函式視同普通函式那樣產生函式呼叫程式碼,遞迴函式***自己呼叫自己的函式***是不能被用來做行內函數的。行內函數只適合於只有1~5行的小函式。對一個含有許多語句的大函式,函式呼叫和返回的開銷相對來說微不足道,所以也沒有必要用行內函數實現。
5.成員函式初始化列表有什麼作用?什麼必須在成員初始化列表中進行初始化?
類的static變數在類的建構函式前已進行初始化!
類物件的構造順序:
***a***分配記憶體,呼叫建構函式時,隱式/顯式的初始化各資料成員***順序和類中宣告物件一致***。如果無成員初始化列表。隱式初始化階段按照宣告的順序依次呼叫所有基類的預設建構函式,然後所有成員類物件的預設建構函式。
***b***進入建構函式執行函式體內語句,函式體內的資料成員的設定被認為賦值,而不是初始化。
所以,使用初始化列表的兩個情況:
1***必須使用初始化列表進行初始化![1]資料成員為類物件並且該類物件僅提供帶引數的建構函式[2]const修飾的資料成員[3]引用資料成員;
2***考慮效率的時候!因為未利用初始化列表而是在建構函式體內進行賦值,則呼叫了預設建構函式和賦值運算子操作。如果資料成員為自定義的類物件,則效率比直接利用建構函式初始化低很多。
6.指標與引用的區別
相同點:
都是地址的概念;指標指向一塊記憶體,它的內容是所指記憶體的地址;而引用則是某塊記憶體的別名。
不同點:
指標是一個實體,而引用僅是個別名
引用只能並且必須在定義時被初始化一次,之後不可變***類似常量指標,引用自帶常量指標屬性***;指標可變;
引用沒有const,指標有const,const的指標不能夠改變;***int & const refer 不存在,因為引用本身就初始化一次不可變,但是const int &refer是存在的,指引用所指向的值不可改變***
引用不能為空,指標可以為空
sizeof針對指標得到的是指標的大小,針對引用得到的是指向物件的大小;
指標的++操作和引用的++操作完全不同,指標為移動指標地址,引用++操作作用於指向的物件;
引用是型別安全的,而指標不是型別安全的。
7.建立空類時,哪些成員函式是系統預設的?
建構函式,拷貝構造,賦值函式,解構函式,取址運算子,const取址運算子
8.有10W個IP段,這些IP段之間都不重合,隨便給定一個IP,求出屬於哪個IP段
9.網路程式設計***網路程式設計正規化,非阻塞connect***
常見的IO模型有阻塞、非阻塞、IO多路複用、非同步。
程式設計師面試筆試寶典