2012 百度實習生筆試(1)

用心傾聽發表於2012-08-28
1. 單詞a中任意字母交換位置變為單詞b,我們就稱單詞a,b為兄弟單詞,如 army 與 mary為兄弟單詞。現給一個單詞字典,使用者輸入一個單詞,找出字典中所有的兄弟單詞,請寫出你的解題思路和演算法。
答案:
(思路一)計算ASCII碼,如果值與輸入詞的ASCII碼相等,再判斷;
(思路二)是對輸入的單詞進行全排列,對每一種排列在字典裡查詢,統計查到的兄弟單詞個數。(但是這個思路有個問題,就是單詞的字母太多的時候,排列情況非常多,查詢時間複雜度很大)
(思路三)將字典裡的所有單詞按字母順序重新組成單詞,如army和mary都變成amry,那麼所有兄弟單詞都變成同樣的單詞。再對這些變化過後的單詞做hash對映,再對輸入的單詞做同樣的對映,就可以很快查詢出所有兄弟單詞,查詢的時間複雜度為O(1)

2. 執行緒和程式有什麼區別,“執行緒安全”怎麼理解?
答案:
執行緒是指程式內的一個執行單元,也是程式內可排程的實體。
與程式的區別:
1)地址空間:程式內的一個執行單元;
程式至少有一個執行緒;
它們共享程式的地址空間;
而程式有自己獨立的地址空間;
2)執行緒是處理器排程的基本單位,但程式不是;
3)執行緒是處理器排程的基本單位,但程式不是;
4)二者均可併發執行。
程式是具有一定獨立功能的程式關於某個資料集合上的一次執行活動,程式是系統進行資源分配和排程的一個獨立單位。
執行緒是程式的一個實體,是CPU排程和分派的基本單位,它是比程式更小的能獨立執行的基本單位.執行緒自己基本上不擁有系統資源,只擁有一點在執行中必不可少的資源(如程式計數器,一組暫存器和棧),但是它可與同屬一個程式的其他的執行緒共享程式所擁有的全部資源。一個執行緒可以建立和撤銷另一個執行緒;同一個程式中的多個執行緒之間可以併發執行。


如果你的程式碼所在的程式中有多個執行緒在同時執行,而這些執行緒可能會同時執行這段程式碼。如果每次執行結果和單執行緒執行的結果是一樣的,而且其他的變數的值也和預期的是一樣的,就是執行緒安全的。
或者說:一個類或者程式所提供的介面對於執行緒來說是原子操作或者多個執行緒之間的切換不會導致該介面的執行結果存在二義性,也就是說我們不用考慮同步的問題。
  執行緒安全問題都是由全域性變數及靜態變數引起的。
若每個執行緒中對全域性變數、靜態變數只有讀操作,而無寫操作,一般來說,這個全域性變數是執行緒安全的;若有多個執行緒同時執行寫操作,一般都需要考慮執行緒同步,否則就可能影響執行緒安全。

3. c與c++分別是怎樣動態分配和釋放記憶體的,有什麼區別?
答案:
c語言提供記憶體動態分配的函式有:malloc、calloc、realloc,在使用這些函式時必須包含其標頭檔案,分別為:<malloc.h>、<stdlib.h>、<alloc.h>
1) malloc 函式: void *malloc(unsigned int size)
在記憶體的動態分配區域中分配一個長度為size的連續空間,如果分配成功,則返回所分配記憶體空間的首地址,否則返回NULL,申請的記憶體不會進行初始化。
2)calloc 函式: void *calloc(unsigned int num, unsigned int size)
按照所給的資料個數和資料型別所佔位元組數,分配一個 num * size 連續的空間。
calloc申請記憶體空間後,會自動初始化記憶體空間為 0,但是malloc不會進行初始化,其記憶體空間儲存的是一些隨機資料。
3)realloc 函式: void *realloc(void *ptr, unsigned int size)
動態分配一個長度為size的記憶體空間,並把記憶體空間的首地址賦值給ptr,把ptr記憶體空間調整為size。
申請的記憶體空間不會進行初始化。

用c語言提供的這些動態記憶體分配函式後,對於這些已經申請的記憶體空間需要你自己進行釋放。如果你沒有釋放,並且你只是隨便執行一下自己的一個很小的程式,可能不會產生什麼很大的影響。但是,如果這樣一個大型程式或軟體執行中呼叫了這些語句,而沒有對申請的記憶體進行釋放,那麼後果是很嚴重的。
因此,在我們平時寫程式的過程中,應該養成好的變成習慣。在使用了這些函式動態分配了一段記憶體後,要記得對其進行釋放。
釋放的函式為free函式:
free函式原型為:void free(void *ptr)
作用:釋放由上面3種函式所申請的記憶體空間。
引數:ptr:指向需要釋放的記憶體空間的首地址。

在C++中,記憶體分成5個區,他們分別是堆、棧、自由儲存區、全域性/靜態儲存區和常量儲存區。
申請和釋放堆中分配的儲存空間,分別使用new 和 delete 的兩個運算子來完成:
指標變數名 = new 型別名(初始化式);
delete 指標名;
例如:
int *pi = new int(0)

相關文章