二狗的面試題整理 其二

2022-02-16 07:27:49 字數 4564 閱讀 4271

之前看過某位大佬的部落格,說咱們搞技術的常常參加一些面試是有些好處的。二狗比較認同這句話,一是可以長長見識,畢竟在熟悉的環境做就了容易固步自封。二是可以及時的了解市面的**與自己的能力水平。哈,廢話不多,記錄一下最近遇到的一次面試題。

1.用遞迴計算出1,1,2,3,5,8,13 . . .第三十位是多少?

很經典的斐波那契數列,用遞迴實現也比較容易。其實只需要在遞迴時額外傳入乙個depth引數,來計算遞迴深度,直到計算出第三十位即可。額外扯一句,用depth標識遞迴深度是個很常用的思想,在一些問題的求解時,甚至可以直接使用遞迴深度來作為遞迴終止條件。

另外再稍微bb一下,在學習遞迴時其實有兩點對二狗幫助很大。

1.不要上來就嘗試去寫遞迴的**,要先寫出遞推公式並找到遞迴終止條件,利用這兩點來翻譯成真正的**。

2.不要嘗試用人腦去模擬遞迴的過程,人腦畢竟與電腦有很大的差別,如果你嘗試這麼做很容易讓思維變得十分混亂。可以借助輸出與log來檢視每次遞迴的過程。

2.pdb檔案是什麼,調式的時候應該把pdb檔案放到**。

這道題目有一說一,我沒有答上來。只是隱約記得本地build生成的檔案中每個dll檔案通常會對應的pdb檔案。

pdb檔案全名是program database file(哈,所以簡寫為什麼不是pdf?),儲存著除錯和專案狀態資訊,使用這些資訊可以對程式的除錯配置進行增量鏈結。visual studio 偵錯程式使用 exe 或 dll 檔案中的 pdb 路徑查詢 project.pdb 檔案。 如果偵錯程式無法在該位置找到 pdb 檔案,或者該路徑無效,偵錯程式將先搜尋包含 exe 的路徑,然後搜尋**「選項」對話方塊中指定的符號路徑。 該路徑通常是「符號」節點中的「除錯」資料夾。 如果偵錯程式無法找到 .pdb 檔案,則顯示「查詢符號」**對話方塊,這將允許您搜尋符號或向搜尋路徑新增其他位置。

上述描述摘自微軟給出的文件,英文版也貼一寫:

所以其實答案已經比較清楚了。pdb檔案是儲存著除錯和專案狀態資訊的檔案,通過它可以幫助我們進行除錯。然後vs會預設在生成我們的exe或dll的路徑下尋找pdb,如果找不到就會按照你的配置中指定的路徑去尋找。至於配置的路徑,就看你怎麼定義了。

這裡筆者沒有指定pdb檔案的路徑~~。

3.xmlserializer使用有哪些限制?

嗯,二狗做過的專案大都是以json格式傳遞資料,xml確實接觸的不多。面試時只回答上了要求物件非空,想想還有點尷尬。。。

xmlserializer 物件使你能夠把乙個 xml 文件或 node 物件轉化或「序列化」為未解析的 xml 標記的乙個字串。而關於有哪些限制,筆者查到的內容如下:

xmlserializer的有一些缺點。

必須知道所有的型別被序列化。通過介面,重新presents乙個型別,序列化不知道你不能把它傳遞的東西。

在它不能做迴圈引用。

將序列化的同乙個物件多次,如果物件圖中多次引用。

在無法處理私有字段序列化。

4. 基礎題目

int i = 12;

int j = i;

j = 13;

console.writeline("i : , j: ", i, j);

i = 14;

console.writeline("i : , j: ", i, j);

輸出結果,第一次i=12,j=13。第二次i=14,j=13。很簡單的題目,值型別的變數,儲存的就是本身的值。

5. 具體題目有些記不清楚了,總之是關於string的,當然原始的題目沒有這麼複雜啦。

1

string s1 = "

123";2

3 console.writeline("

s1 hash:

", s1.gethashcode());45

string s2 = s1 = "

456";6

7 console.writeline("

s1 hash: , s2 hash:

", s1.gethashcode(), s2.gethashcode());89

string s3 =s1;

1011 console.writeline("

s1 hash: , s2 hash: , s3 hase:

", s1.gethashcode(), s2.gethashcode(), s3.gethashcode());

1213 console.writeline("

s1: , s2: , s3:

", s1, s2, s3);

1415 s3 = "

789";16

17 console.writeline("

s1 hash: , s2 hash: , s3 hase:

", s1.gethashcode(), s2.gethashcode(), s3.gethashcode());

1819 console.writeline("

s1: , s2: , s3:

", s1, s2, s3);

2021

string s4 = "

abc";22

string s5 =s4;

2324 console.writeline("

s4: , s5:

", s4, s5);

25 console.writeline("

s4 hash: , s5 hash:

", s4.gethashcode(), s5.gethashcode());

2627 s5 = "

def";28

29 console.writeline("

s4: , s5:

", s4, s5);

30 console.writeline("

s4 hash: , s5 hash:

", s4.gethashcode(), s5.gethashcode());

3132

string s6 = "

xyz";33

string s7 = "

xyz";34

35 console.writeline("

s6 hash: , s7 hash:

", s6.gethashcode(), s7.gethashcode());

小夥伴們可以試一下看自己能不能全答對。這道題有些慚愧,因為畢竟比較基礎,筆者的回答應該不是全對。

首先要明確string是引用型別。也就說實際上s1等變數指向的只是乙個位址,那我們就可以推斷s2=s1可能是讓s2和s1指向同乙個位址。再有筆者之前有印象說是string是一旦賦值就不可以改變的,而這兩點是有一些矛盾的。具體解釋的話大家可以看一下園子裡這篇文章,解釋的很詳細。傳送門。

總結下來的話,string確實是引用物件沒錯,它的值也確實不會更改,每次試圖更改的時候都會生成新的物件。但是還是要結合clr中的字串駐留技術,值相同的字串會指向相同的位址。

下面是執行結果:

這樣總結來看,似乎string確實挺奇葩的。本身的個引用型別,「string s6 = "xyz"; string s7 = "xyz";」 卻會指向相同的位址,有點反常識了哈哈。

6. equals 和 == 的區別。

簡單來說,對於值型別,二者比較的都是具體的值,所以沒區別。對於引用型別,== 比較的是兩個物件的引用位址,而equals就要看具體的實現了,如果你重寫了對應的equals的方法,就按照你的邏輯進行判斷,預設情況是比較兩個物件的內容的區別。

7. 深拷貝與淺拷貝的區別,有哪些物件使用的是深拷貝.

第一問其實很簡單,對於引用型別才有這樣的區別,深拷貝會生成新的物件,淺拷貝只是複製了引用的位址。因此對於淺拷貝,會出現改變乙個物件的值,另乙個物件跟著改變的情況。第二問有些懵逼,一時沒有好的思路,可能要結合具體的場景把。

8. 分布式系統怎麼生成全域性唯一的id。

這個題目說實話沒有在現實場景中碰到過,畢竟接觸的專案實在是有些淺顯了。二狗當時寫的答案是兩種方式,

利用guid+mac位址的方式,當時的想法是guid產生相同值的概率很低,再加上每台硬體唯一的mac位址應該可以保證唯一。

所有申請操作都在主伺服器上完成,由某台主伺服器統一生成。

9. 最後一道是個演算法題。詳情可以檢視leetcode第一題,兩數之和。

嗯,重溫了一下,官方的一遍雜湊法還是很騷氣的,哈哈。多刷題還是有好處的,嘻嘻。

面試題整理 二)

1.把二元查詢樹轉變成排序的雙向鍊錶 題目 輸入一棵二元查詢樹,將該二元查詢樹轉換成乙個排序的雙向鍊錶。要求不能建立任何新的結點,只調整指標的指向。10 6 14 4 8 12 16 轉換成雙向鍊錶 4 6 8 10 12 14 16。include include struct bstreenod...

python面試題整理(二)

前一篇博文博主總結了10道python面試題,戳這裡可以回看,本文繼續整理python面試題,希望能幫到大家 11.迭代器和生成器的區別 1 迭代器是乙個更抽象的概念,任何物件,如果它的類有next方法和iter方法返回自己本身。對於string list dict tuple等這類容器物件,使用f...

面試題整理 C (二)

1.類,介面的區別 從定義的角度 類描述乙個實體,包括狀態 屬性和動作 介面定義一類動作,沒有實現,也沒有狀態資訊 從程式的角度 介面是函式宣告 類是函式實現 介面可以有屬性,不能有欄位 乙個子類只能繼承乙個父類,但是可以繼承多個介面 2.介面和抽象類的區別 抽象類是一類事物的高度聚合,介面是定義行...