給你一個鏈表和一個 random函數, 設計一個演算法能隨機返回鏈表的某個節點, 要求每個節點被返回的機率一樣。限制條件是只能遍曆鏈表一次並且不能用額外空間。

來源:互聯網
上載者:User

某全球著名搜尋引擎公司面試題。

說實話這類型的題如果你不知到真的很難解。  可能的思考方式是,(假設總共有n個節點,n是未知)當我走到第x個節點的時候,可以利用的資訊是我已經走了x步了,需要想一種方式決定我是否選該節點,並且這種方式讓當前節點被選中的機率是1/n.

 

這裡的關鍵點時,解決的方法是,當走到第x步時,以1/x的機率決定是否選第x個。第x+1步時,以1/(x+1)步的機率決定是否選中第x+1個。這樣第x個被當作最後結果的機率是,第x個被選中,第x個之後的(x+1,x+2,...,n)都沒被選中。其機率為 1/x * x/(x+1) *(x+1)/(x+2) ... (n-1)/n  = 1/n 。

範例程式碼如下(未考慮輸入錯誤檢查):

Node* GetRandomNode(Node* header)

{

         Node* p = header;

         Node* result = nil;

         int count =0;

         for(; p != null; p = p->next)

        {

             count++;

             if(0 == random(count))

             {

                    result = p;

             }

             p = p->next;

        }

        return result;        

}

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.