幾道面試到的演算法題

來源:互聯網
上載者:User

 

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出現過的最大的值,在過程中記錄下子數組即可。

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.