幾道面試到的算法題

 

1.如何判斷一個鏈表是否爲循環鏈表

一個錯誤的想法

將一個指針p指向頭節點,另一個指針q往後遍歷,如果直到qnull時任然沒有遇到q==p的情況,那麼不是循環鏈表,如果在其中遇到q==p的情況,則此爲循環鏈表。這種想法的錯誤之處在於沒有考慮到A->B->C->D->B這種循環不包括第一個節點的情況。

一個比較笨的想法

遍歷整個鏈表,將遍歷到的節點地址放到集合中,每次都比較一下新的節點和集合中的節點,如果有重複的,則出現循環鏈表。可以解決,但是要耗費大量的空間和時間。

比較好的想法:

兩個指針同時第一個節點,一個指針每次往後移動一個節點,另一個指針每次往後移動兩個節點。如果在任何一個都不爲null的時候,出現兩個指針值相同,則此爲循環鏈表,否則不是。

 

2.1023個數隨機放到一個10層深度的滿二叉樹中,找出一條從根到葉節點的路徑,使得該路徑經過的節點和最大。

一般的想法:

窮舉所有情況,然後找出最大的路徑。

比較好的想法

對於樹從下往上作貪心處理。從倒數第二層開始,每次選取該節點的較大的子節點加到該節點上。最後加到根節點時,就是最有路徑的值,在過程中記錄下路徑即可。

 

3將一個字符串整體循環右移n個字符,右邊的字符移至最左邊。

一般的想法

(1)新建一個字符串,根據要求將每一位進行賦值,得到結果後copy給原字符串。(2)循環N遍,每次將字符串向右移一位。

比較好的想法

題目的另一個理解是,將字符串分爲兩個子串,最右邊的N個字符組成的字符串B,左邊剩下的字符組成的字符串A,將AB交換位置。可以先將A左右倒置,再將B左右倒置,最後將整個字符串左右倒置。這個算法的時間複雜度爲2×N,而且不需要額外空間。

 

4一個數組中有正數和負數,如何找出它的一個子數組,使得這個子數組是所有子數組中和最大的。

比較好的想法

新建一個變量sum,將數組從左往右遍歷,每次把遍歷到的數加到sum中去,如果sum小於0則捨棄前面的數,將sum清零。最後的結果就是sum出現過的最大的值,在過程中記錄下子數組即可。

 

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