給你乙個長度為n的鍊錶。n很大,但你不知道n有多大。你的任務是從這n個元素中隨機取出k個元素。你只能遍歷這個鍊錶一次。你的演算法必須保證取出的元素恰好有k個,且它們是完全隨機的(出現概率均等)。
解:先選中前k個, 從第k+1個元素到最後乙個元素為止, 以k/i (i=k+1, k+2,...,n)的概率選中第i個元素,並且隨機替換掉乙個原先選中的元素,這樣遍歷一次得到k個元素, 可以保證完全隨機選取。這個演算法叫做蓄水池抽樣有20
個陣列,每個陣列裡面有
500個陣列,降序排列,每個數字是
32位的
unit,
求出這10000
個數字中最大的
500個。 將
20 個
陣列合併為
1 個,挨著連線起來即可,不必保證有序。在合併的陣列中隨機選取乙個元素,然後將所有小於此元素的元素放在其左側,大於到右側。完成操作
後,如果原來被選中的元素剛好處在右數第
500
的位置,那從它開始向右的元素即為所求。否則,如果右端元素數目大於
500,則對右端序列遞迴使用此
方法;否則,如果左端序列數目大於
10000-500
,則對左端序列遞迴使用此方法。複雜度
expected o(n)
在乙個陣列中除兩個數字只出現1次外,其它數字都出現了2次, 要求盡快找出這兩個數字。
位操作方法
單鏈表:
找出單鏈表的倒數第
4個元素:
建立兩個指標,第乙個先走4步,然後第2個指標也開始走,兩個指標步伐(前進速度)一致。
從無頭單鏈表中刪除節點
:這裡採用了「移花接木」的方法。設該節點為b,下乙個節點為c。那麼,首先將b節點的內容替換為c節點的內容,然後,將c節點刪除
判斷兩個鍊錶是否相交並找出交點:
先遍歷第乙個鍊錶到他的尾部,然後將尾部的next指標指向第二個鍊錶(尾部指標的next本來指向的是null)。這樣兩個鍊錶就合成了乙個鍊錶,判斷原來的兩個鍊錶是否相交也就轉變成了判斷新的鍊錶是否有環的問題了
找出帶環鍊錶中環的起點:用兩個步長分別為1和2
的指標遍歷鍊錶,直到兩者相遇,此時慢指標走過的長度就是環的長度。另外相遇後把其中指標重新設定為起始點,讓兩個指標以步長
1再走一遍鍊錶,相遇點就是環的起始點。
單鏈表反序,並返回新鍊錶的頭指標:
1. struct listnode *reverselist(struct listnode *head)
2.
12. return newhead;
13. }
棧問題:
如何用乙個陣列實現兩個棧:分別用陣列的兩端作為兩個棧的起點,向中間擴充套件,兩個棧中的元素總和不超過n時,兩個棧不會相遇。
二叉樹:
找出二叉樹上任意兩個結點的最近共同父結點:首先數一下兩個結點的深度,然後比較深的那個往上走(深
-淺)步,最後同時往上走,肯定會命中最近共同父節點的。如果你把二叉樹的所有節點看成
n的話,我這個演算法只需要
lg(n)
就可以搞定了
在二叉樹中找出和為某一值的所有路徑:到達乙個節點之後計算當前節點和
sum的和,如果為
target
,輸出路徑返回,如果大於
target
,則直接返回,如果小於,則將當前節點的值入棧,更新
sum的值,繼續遍歷,遍歷完成之後,也就是從當前節點返回的時候,將其從棧中彈出,更新
sum
備戰百度實習招聘
1.編譯過程 在cpp檔案中展開include檔案。將每個cpp檔案編譯為乙個對應的obj檔案。連線obj檔案成為乙個exe檔案 或者其它的庫檔案 2.100w 個整數中求最小的 k個數,有哪些方法,優缺點 快速排序 分割槽時,根據數p將陣列分為兩部分,設大於p的數個數為a,小於p的數的個數為b。如...
百度實習面試
c 1 c 細節語法,虛函式,多型,vector 2 寫 二分查詢 快排 改進 逆置鍊錶 3 三次握手 tcp ip結構 4 linux命令 5 資料庫語句 php 1 php寫程式 2 php語法 3 mysql索引 事務 併發 4 mysql多表設計 5 php執行過程 6 c 編譯過程 pyt...
百度暑假實習面試
二面也是 面試。一上來,面試官問我一面的時候有沒有問我兩個100g的檔案的問題,然後問我是怎麼回答的。然後又做了一些改動 在100個g的檔案中,存在重複的資料,如何進行排序。我當時好像回答了分塊和歸併,或者使用位運算節省空間來減少分塊的數量可以提高執行時間。後來面試官問我分塊的目的是什麼,我說是為了...