在很多家公司面試,也包括在攜程,大多都會被問到一些演算法的問題,其中機票事業部的面試,基本上算是演算法問題的重災區,沒辦法,有幾個領導喜歡
用資料結構來考人家,其中包括一些常見資料結構的複雜度以及手寫一些演算法,比如快排,單鏈表等等,前幾天我乙個推薦過來的朋友膝蓋就被中了一箭。
題目就不方便具體說了,第一小問就是用非遞迴來構建乙個單鏈表,我們知道構建單鏈表可以說是學資料結構的基本功,一說到用鏈式結構,它跟遞迴
又有了千絲萬縷的聯絡,很多鏈式的問題,我們用遞迴就可以輕輕鬆鬆的解決,幾乎不需要動一下腦子,但是如果用非遞迴的話,那就稍微比遞迴要複雜一點
了,起碼會多考乙個引用型別記憶體分配的問題。
後來qq上我就用遞迴和非遞迴的形式構建單鏈表回覆了他,先給了乙個遞迴的版本,這個沒問題,可以消化,然後給了乙個非遞迴的版本,看了之後就扛
不住了。
一:遞迴版本
1二:非遞迴版本class
linklist29
10private
linknode head;
1112
public
void add(int
data)13;
17}18else
1922}23
24public
void add(linknode node, int
data)25;
29return;30
}3132add(node.next, data);33}
34 }
1這個非遞迴不理解的地方在於臨時變數temp,提出的問題就是為什麼:「temp.next=node」 之後,head的值發生了改變?我想之所以不能理解,絕逼是對class
linklist29
10private
linknode head;
1112
public
void add(int
data)13;
1516
if (head == null)17
20else
2128
29temp.next = node;30}
31}32 }
引用型別的記憶體分配不了解,而這個非遞迴版本恰恰就是用引用型別這個記憶體分配技巧來實現 」非遞迴構建單鏈表「。。。為了不讓別人踩上這個坑,我還是大
概說一下流程,大概是這樣的,當我們在new乙個引用型別的時候,clr就要計算例項欄位和所有基類上的例項欄位的大小,然後再在堆上分配合理的記憶體塊,
最後把堆上的記憶體塊的首位址儲存在棧上面。
為了方便理解,現在假如linklist裡面有三個結點:instance1 -> instance2 -> instance3,
第一句:
1 linknode temp = head;這個句子不難理解吧,把head的位址賦給temp,那麼棧上temp的位址也就是head的位址,head的位址就是指向instacnce1記憶體塊位址。
了temp,然後就發現instance3的next為null,然後就跳出迴圈。
第三句:從上一句可以看到,instance3的next已經為null了,這時候就把新構建的結點:linknode node = new linknode() ;賦
給temp的next指標上來繼續構建鍊錶。
可以看到這時候instance4就構造到了instance3之後,同時temp.next已經是儲存instance4的記憶體位址,這一些操作對head來說都是透明的,它也不管
後面怎麼操作,當你遍歷head的時候會驚奇的發現居然我的鍊錶中多了乙個instance4,這個也就是朋友疑惑的地方,如果看到這個記憶體分配圖的話,
也許會豁然開朗,當然這篇博文沒什麼技術含量,也是自己一時有感而發。
我沒有乙個好朋友了
從你走的那一刻,我那麼傷心。大概就是今日我思考的,那時我已意識到,你現在已是另乙個你了。這一刻我是如此孤獨。我沒有乙個好朋友了,剩下的都只能算是熟人。獨在異鄉為異客。沒有一點想讓我留下來。我為什麼要留下來?菩提學會?唯一是我留下來的理由。你快樂我就快樂。可是這麼簡單的一句話,我都做不到。如果你痛苦,...
朋友乙個問題引發了我一連串的思考
const int ri i ok,引用不區分型別 ri error,ri為常量,不可變 i ok,右邊的變數與引用無關 ri b error,ri為常量 i j ok,右邊的變數與引用無關 int const ri i error,不存在這種形式,沒有意義 他問我為甚麼ri 會出現編譯錯誤,而i ...
同夥過去口試激發我要說的乙個小話題
起初qq上我就用遞迴和非遞迴的情勢構建單鏈表答覆了他,先給了乙個遞迴的版本,這個沒成績,能夠消化,而後給了乙個非遞迴的版本,看了以後就扛不住了。在許多家公司口試,也包括在攜程,大多都會被問到一些演算法的成績,此中機票事業部的口試,基本上算是演算法成績的重災區,沒方法,有幾個引導愛好用資料布局來考人家...