樹的高度;及字母表分析

紫鳳發表於2013-08-30

今日面試題:樹的高度

有一個棵樹,不一定是二叉樹,有n個節點,編號為0到n-1。有一個陣列A,陣列的索引為0到n-1,陣列的值A[i]表示節點i的父節點的id,根節點的父節點id為-1。給定陣列A,求得樹的高度。

=====================================================

字母表分析

原題

每一種語言,都有自己的字母表,類似英文的a-z,但是順序不相同。例如,有的語言可能是z是第一個之類的。

現在給定這個語言的字典,請分析這個字典,得到這個語言的字母表的順序。 例如:有如下的字母:

1. C

2. CAC

3. CB

4. BCC

5. BA

經過分析,得到字母表為C->A->B。

分析

這個題目,在給出例子的時候,結果寫作:C->B->A,這個是疏忽了,幸好很多同學都發現了,沒有引起太多的舞蹈。

所以,在這裡很感謝大家指出問題所在,並且,如果在分析中,大家有覺得不合適的地方,也請大家指出。稍後,會在待字閨中或者微博中說明,真切的希望更多的同學受益。

這個題目其實是比較簡單的一個題目。可能題目描述上,有點嚇人,其實理解了之後,就會發現,還是蠻簡單的。

這個題目的關鍵就在於:

字典其實隱含了字母的順序的

這個是很自然的,如果沒有想到這一點,這個題目任意解都可以的。而字典有序,是可以作為一個常識的。我們延續題目中的例子進行分析。

首先,C一定是在B之前的,這個是由字典本身的屬性決定的。那麼剩下的如何考慮呢?比較完第一個字母不同的情況,則比較第一個字母相同的情況。

考慮C和CA,根據我們的經驗,A一定是在C後面的,如果A在C的前面,則應該是CA,C的順序。這樣:

  • 根據C和CAC,我們得到C->A(表示C在A的前面,後面同理)
  • 根據CAC和CB,我們得到A->B
  • 根據CB和BCC,我們得到C->B

綜合,我們有C->A,A->B,C->B這三個關係,但是,還沒有結束。根據這三組關係,如何得到CAB的關係呢? 這三組關係,構成了一個有向無環圖,很自然就想要要用拓撲排序得到CAB之間的整體排序。

拓撲排序的演算法,不在這裡詳述,總結一下這個題目的思路:

  • 構建有向無環圖:按照字典中單詞的順序,每兩個進行比較,找到第一對不相同的字母,確定他們的順序
  • 對有向無環圖進行拓撲排序

構建有向無環圖的時間複雜度為O(N*M),N是字典中單詞數目,M是單詞長度;有向圖拓撲排序的時間複雜度是O(|V|+|E|)。

這個題目,並不是難題,解決的過程中,僅僅抓住字典的特點即可。

【分析完畢】

本文來自微信:待字閨中,2013-08-27釋出,原創@陳利人 ,歡迎大家繼續關注微信公眾賬號“待字閨中”。

相關文章