題目是這樣的:
乙個檔案中按行存放若干字串,要求只能按順序遍歷檔案一次,不能用**儲存字串偏移,隨機返回乙個字串。
本人愚笨,在那掙扎了半天沒有結果,悻悻而歸。
今天在看《c專家程式設計》,猛然發現,附錄a.6就是原題!真是悔恨啊,讀書太少啊,蒼天大地啊~~
它是這樣解的:
基本的技巧是在倖存的字串中挑選,並在過程中不斷更新。
開啟檔案並儲存第乙個字串,些時就有了乙個備選字串,並有100%的可能性選中它。儲存這個字串,繼續讀入下乙個字串,這樣就有了兩個字串,選中每個的可能性都是50%。選中其一並儲存,然後丟棄另乙個。再讀入下乙個字串,按照新字串33%原先倖存的字串67%的概率(它代表前兩個字串的倖存者),在兩者之間選擇乙個,然後儲存新選中的字串。
根據這個方法,依次對整個檔案進行處理。在其中每一步,讀入字串n,在它(按照1/n的概率)和前乙個倖存的字串(按照n-1/n的概率)之間進行選擇。當達到檔案末尾的時候,最後乙個倖存的字串就是從整個檔案中隨機提取的那個字串!
請參閱《c專家程式設計》281頁 附錄a.6。
程式設計師面試題精選
問題描述 輸入乙個字串,列印出該字串中字元的所有排列。例如輸入字串abc,則輸出由字元a b c所能排列出來的所有字串abc acb bac bca cab和cba。問題分析 這是一道很好的考查對遞迴理解的程式設計題。寫遞迴程式關鍵有兩點,處理好進入與返回的關係,進入時改變了什麼,返回時應當恢復。字...
程式設計師面試題精選100題
今天開始各種刷面試題,沉下心來集中時間,全身心投入 題目 輸入一棵二元查詢樹,將該二元查詢樹轉換成乙個排序的雙向鍊錶。要求不能建立任何新的結點,只調整指標的指向。比如將二元查詢樹 10 6 14 4 8 12 16 轉換成雙向鍊錶 4 6 8 10 12 14 16。相關概念 二元查詢樹 它首先要是...
程式設計師面試題精選 歸併排序
採用分治策略 一般有三個步驟 1 分解 將n個元素分成各含n 2個元素的子串行 2 解決 用合併排序法對兩個子串行遞迴的排序 3 合併 合併兩個已排序的子串行以得到排序結果。在歸併排序時,其長度為1時遞迴結束。單個元素被視為是已排序好的。includeusing namespace std defi...