這大概是我有經驗來最神奇的面試經驗了(●▼●;)
面試時間一個小時,基本上就是就一個人寫code,另外一個人一直看著寫code..XD。想當然爾,面試結果想當然是被考官狠狠洗臉了 QAQ
(圖片來源: Heraklion Innovation Map)
大概會好一陣忘不了這次面是的考題 AutoComplete
吧
Ultimate Autocomplete
那天面試官一開始就直接跳過自我介紹,端主菜了上個道 Design and Implement Question 給我 - 實做一個 Ultimate Autocomplete。
Ultimate Autocomplete
在最短的時間和空間內以良好的順序輸出預測的單詞列表,在理想情況下,列表的第一個單詞是正確的選擇。
概念陳述
trip(圖片來源: JanGin's BLOG)
在寫程式碼之前,面試官要求先用文字寫下演算法後再進行實作。 聽到這個題目,第一反應是使用 字典樹(Trie) 實做,先用目前使用者的輸入做為 prefix,進行搜尋找出所有以該詞為字首的單詞,再將取出的結果進行排序。
實作分幾個階段
- 將字典中的單字建成字典樹
- 從字典取出每個單字變成 char stream
- 將 char stream 由根節點往深度方向尋訪,依序建出子樹
- 根節點為空字元,不應該寫入任何字元
- 若該節點為單字結尾,該節點應加上標記,並寫入額外資訊,例如:詞頻、詞性…等
- 重複步驟 1.1 與 1.2,直到字典中所有單字都建立完畢。
- 尋訪字典樹,找出所有符合的清單
- 將使用者的輸入做為 prefix,進行搜尋找出目前所在節點
- 使用深度優先,尋訪該節點的所有子樹
- 回傳尋訪結果
結果包含完整單字(即由根節點到被標記為單字結尾節點的路徑所組成的字串)、詞頻、詞性…等額外資訊。
- 將結果進行排序後輸出
- 排序時,可再加入如歷史資訊等訊息,使預測結果更符合使用者的需求
- 回傳結果應去除額外資訊
實作
1 |
|
感想
果然靜下心來寫,陳述的會比較有條理些… 為啥面試的時候可以卡成那樣 Orz
然後 LeetCode 要乖乖刷阿,這次時間太趕根本來不及準備,LeetCode No. 208 是建 Trie 的阿阿阿阿