只懂得看別人分享經驗,或是就直接去線上刷題
但也不知道要寫到什麼程度,感覺有無限多種題目在網路上
直到被電了好幾場後才慢慢找到感覺
準備資料
1. Cracking code interview
這本經典書籍我覺得務必要看完並且把上面題目都做過一遍 (一定要自己打開電腦打一遍)
雖然上面題目沒有很難,但基本會被問到的概念裡面都有了
2. 刷題網站
像是leetcode之類的網站可以增加題目的廣度,很多電話面試經常問經典題
說不定就給你碰到了 (有遇過幾家大公司電面就是基本題)
值得注意的就是不要因為是經典題很熟悉就不自己動手做了
有時簡單的 2 Sum 或 Binary Search 緊張起來還會寫的卡卡的 (親身慘痛經驗)
3. 經驗分享
前人的智慧值得借鑑,可以花點時間看看別人被問什麼
像是一畝三分地,CareerCup之類的網站都有很多資訊
假如看到完整的題目也可以嘗試自己做做看
概念,題目
不知道以後會如何,不過那時面試最喜歡問的當然就是
0. BigO
BigO的正確定義需要熟記於心,有時HR打電話來很喜歡問你這題
2. Array, List, Stack
這些不用說了吧,特性效能以及如何選擇都是基本概念
2. Hashing
最喜歡問的以及業界最常用到的就是Hashing了
Hashing的概念以及如何實作,優點缺點效能都需要了解
3. Tree, Graph
Tree和Graph相關的演算法很重要
我碰過的題目中覺得最難寫的都是要用到Graph search的問題
但這類問題相對好解,套用相對應的演算法通常就出來了
但程式碼在寫起來落落長非常難寫,需要多做練習
4. Recursion
其實遞迴類的解法效能都不是最佳,通常運用到的是DP演算法
但還是要熟悉遞迴的思路
有時想不到最佳解,先丟個遞迴版本的答案也好
5. Heap
以前在台灣上課時都沒強調這個資料結構
但某些題目知道Heap如何使用的話會比較好想到答案
6. Sort,Search
排序和二元搜尋就不需要多講了
通常面試都喜歡問機車的O(n)解,所以先做排序的答案都不是最佳解
但跟遞迴一樣,可以先丟出這類答案來爭取時間思考最佳解
題目
1. Hashing
這類題目只要想到如何運用HashMap就可以解出來了
相對簡單
2. String
移除重複或對它做其他操作,通常部會太難,想一下就出來了
通常部會有太多奇怪變化,有看作類似題目就賺到了 (像是數學運算)
3. Array
通常會要做變形,搜尋,或找子集
這類題目也沒遇過太奇怪變化,但是沒遇過的問題解法常常很難想到
像是我曾經電話面試被問maximum sum subarray
經典題目剛好有看過,小小模擬掙扎了一下後給出正確解答
面試官心情很好說剩下5分鐘那問你一個小變形好了
maximum product subarray呢?
我從來沒想過可以考product呢,於是我就爆了
4. Tree,Graph
我當時遇到的面試非常愛考這類題目
Tree比較少考,只有電話面試碰到過一次(Binary Tree)
最喜歡的就是BFS,DFS類的題目
這種題目我覺得最多變化,題目背景千奇百怪
但萬變不離其中,套個BFS通常就結束了
通常都是什麼找路徑之類的
只是迴圈版的BFS程式碼又臭又長不太好寫,一定要多練習幾遍
5. Mutation
這類型是我覺得面試裡面會被問到最複雜的題目,因為程式碼非常長
通常需要BFS + Recursion
問題通常是找出所有可能 (給你一些條件),或是列出所有變形或子陣列
某大公司從電面到on-site問了一堆這種,也是頗有創意
什麼給你洋流圖找最短路徑,還有給你一個三角形資料結構找東西
這種題目的最主要的思路都是要想好停止條件不能讓搜尋無窮迴圈
因為通常條件都是可以問出來或是從題目得知
所以我覺得解法不難想
主要難點是這類題目你想到解法還不一定能快速寫出來....
我所能想到這就是這些了,其他什麼Design question我覺得就要靠當下的靈感了
有遇過比較深刻的是某公司面試前給我的參考資料中,有附上他們引以為傲的paper
後來的系統設計就是考他們paper裡面的東西
算是蠻有趣的
沒有留言:
張貼留言