1.如何判斷一個鏈表是否為迴圈鏈表
一個錯誤的想法:
將一個指標p指向前端節點,另一個指標q往後遍曆,如果直到q為null時任然沒有遇到q==p的情況,那麼不是迴圈鏈表,如果在其中遇到q==p的情況,則此為迴圈鏈表。這種想法的錯誤之處在於沒有考慮到A->B->C->D->B這種迴圈不包括第一個節點的情況。
一個比較笨的想法:
遍曆整個鏈表,將遍曆到的節點地址放到集合中,每次都比較一下新的節點和集合中的節點,如果有重複的,則出現迴圈鏈表。可以解決,但是要耗費大量的空間和時間。
比較好的想法:
兩個指標同時第一個節點,一個指標每次往後移動一個節點,另一個指標每次往後移動兩個節點。如果在任何一個都不為null的時候,出現兩個指標值相同,則此為迴圈鏈表,否則不是。
2.把1023個數隨機放到一個10層深度的滿二叉樹中,找出一條從根到分葉節點的路徑,使得該路徑經過的節點和最大。
一般的想法:
窮舉所有情況,然後找出最大的路徑。
比較好的想法:
對於樹從下往上作貪心處理。從倒數第二層開始,每次選取該節點的較大的子節點加到該節點上。最後加到根節點時,就是最有路徑的值,在過程中記錄下路徑即可。
3將一個字串整體迴圈右移n個字元,右邊的字元移至最左邊。
一般的想法:
(1)建立一個字串,根據要求將每一位進行賦值,得到結果後copy給原字串。(2)迴圈N遍,每次將字串向右移一位。
比較好的想法:
題目的另一個理解是,將字串分為兩個子串,最右邊的N個字元組成的字串B,左邊剩下的字元組成的字串A,將A和B交換位置。可以先將A左右倒置,再將B左右倒置,最後將整個字串左右倒置。這個演算法的時間複雜度為2×N,而且不需要額外空間。
4一個數組中有正數和負數,如何找出它的一個子數組,使得這個子數組是所有子數組中和最大的。
比較好的想法:
建立一個變數sum,將數組從左往右遍曆,每次把遍曆到的數加到sum中去,如果sum小於0則捨棄前面的數,將sum清零。最後的結果就是sum出現過的最大的值,在過程中記錄下子數組即可。