面試:雜記(一)

    這裏主要記錄一些面試中被問過的問題。

1. realloc、malloc、calloc的區別

    工作用的主要是C++,所以只是對malloc瞭解一些。

    1) void *malloc ( size_t size )

        最常用的一個了,就是申請size個字節大小的空間了,這裏不會對分配空間進行初始化操作。

    2) void *calloc ( size_t num_elements, size_t element_size )

        申請num_elements * element_size個字節大小的空間,即兩個參數分別是元素個數即元素大小,element_size一般使用sizeof求出來的。除了參數外,calloc與malloc不同的還有它會將分配空間的每個位都初始化爲0。

    3) void *realloc (void *ptr, size_t new_size )

        用於對已有空間進行調整,ptr爲舊空間的地址,而new_size則會調整後的大小。對於ptr和new_size,有以下幾種情況(假設舊空間的大小爲old_size)。

        ptr != NULL 而 new_size == 0:此時相當於free函數,會釋放ptr所指向的空間,並且返回NULL。

        ptr != NULL 而 new_size > old_size:擴大空間,先判斷當前的指針是否有足夠的連續空間,如果有,擴大ptr指向的地址,並且將ptr返回,如果空間不夠,先按照new_size指定的大小分配空間,將原有數據從頭到尾拷貝到新分配的內存區域,而後釋放原來ptr所指內存區域(注意:原來指針是自動釋放,不需要使用free),同時返回新分配的內存區域的首地址。即重新分配存儲器塊的地址。注意擴大部分的空間內容是不會被初始化的。

        ptr != NULL 而 new_size < old_size:縮小空間,會將超出new_size的空間釋放。

        ptr == NULL時,相當於調用malloc函數。

        當沒有足夠的空間用於擴大時,返回NULL而原來的內存塊不變,所以這裏不能直接用ptr = realloc(ptr, 100)這種方式,而需要先對返回值進行判斷。

 

2. 100層樓丟兩個玻璃球

        一棟100層高的大樓,給你兩個完全相同的玻璃球。假設從某一層開始,丟下玻璃球會摔碎。那麼怎麼利用手中的兩個球,用什麼最優策略知道這個臨界的層是第幾層??

       基本上都可以想到用分段的方法來解決。當時我給出的思路是分十段,找到臨界點在第幾段後再一層層嘗試。但是這種方法,如果是在第1段最差次數是10次(1~10),在第2段則最差是11次(10~20),在第k段則最差是9+k次。很顯然這是不平均的,層數越高,我們所需要測試的最差次數就越多。

       所以我們每一個分段的最差測試次數要儘量是一樣的,這也是這個問題的考察點所在。通過上面的分析,我們可以發現平均分段時第一段比第二段少一次,第二段又比第三段少一次。那麼,我們只需要讓第一段層數比第二段層數少一層,第二段層數比第三段層數少一層就可以讓每個分段的測試次數一樣了。我們可以假設第一段層數爲k,則有如下公式:

                                  k+k-1+k-2+...+ 2 >= n

      通過上面的算式我們可以得到k=14,即第一段的層數爲k,也就是說我們的最差次數爲14次。第一次在14層扔,沒碎則在27層扔,以此類推。

 

3. 怎麼判斷一個數字是否是2的n次方數

      即判斷一個數是否是2^n次方。很簡單,如果數X是2的n次方,則其二進制必定爲000010000這樣子的格式,即只有一個位爲1而其餘位爲0(不考慮符號位),則X-1爲000001111,即原來爲1的位變爲0,該位後面的所有位全部都變爲1。顯然後000010000 & 000001111 == 0。

     所以,我們只需要判斷X & (X-1)是否爲0,爲0則說明X是2的n次方,否則不是。

 

4. 爲什麼紅黑樹要限制不能是連續兩個紅節點

     當時自己的回答是如果可以連續是兩個紅節點,那麼區分紅黑節點就沒有任何意義了。但感覺原因不是這個,然後找了下紅黑樹節點的來源,找到了下面的博客:

     清晰理解紅黑樹的演變---紅黑的含義

     才知道紅黑樹的節點是由2-3樹演變而來的。而2-3樹是能夠保持整個樹的完美平衡的,但是由於2-3樹實現複雜,所以纔將3-節點中的最左邊節點變成紅節點而其他節點變成黑節點從而構造出了紅黑樹。假如可以是連續紅節點,那回歸到2-3樹將出現某個節點是4-節點,會破壞掉2-3樹的完美平衡。這便是我看完博客後覺得要限制不能是連續兩個紅節點的另一個原因了。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章