聽說你最近在刷題:軟體工程師面試一定會遇到的資料結構與演算法關卡

聽說你最近在刷題:軟體工程師面試一定會遇到的資料結構與演算法關卡
非內文當事人照片|Photo Credit: Depositphotos

我們想讓你知道的是

準備演算法的方式,不僅只有瘋狂刷題,本文提供有效的學習方法與審題技巧。 

先澄清一下我現在沒有在刷題(我這樣講絕對不是怕很多同事會看到我的文章XD),說實在的,我覺得大家好像太過度強調「刷」題的刷,好像刷油漆似的要來回刷很多遍。我過往看過許多「刷」幾百題或每題做2~4次以上的人,分享他們的經驗,我很佩服他們投入的時間及毅力,但我自知做不到,有小孩後更是難以做到「刷」一遍。

我自己找軟體工程師的工作的經驗,2015年上完Coding Bootcamp到找到工作,大概做了60題左右的Leet Code問題,2016年底找工作比較認真,大概完成了100題左右。今天這篇文章,主要想分享我的演算法準備方式,如果你想要找如何刷題的方式,或是覺得無法「刷」幾百題很多遍的人,歡迎往下閱讀。

持之以恆,養成每天練習1至2題習慣

2015年上完Coding Bootcamp後,我陸續有一些電話面試,每天可能會有1~3個電話面試。所以在準備面試上,要研究公司,並且依照職缺來做面試的複習。因為我是面試前端相關的職缺,所以也有一部分的精力在前端的資料複習。關於資料結構及演算法(Data Structures & Algorithms)的練習,我大概維持一天練習1~2題的步調。2016年底的面試,因為還要上班,所以基本上只有晚上有時間,可能一天只能練習1題,假日有比較多時間才可以多做幾題。

解題前,先仔細審題:確認題目input、格式、desired output

看到問題的時候,我會先確保我了解題目的意思,真正在面試的時候,通常第一步也是和面試官確認我們自我的理解和面試官要問的是否一致。不要花了時間才發現一開始的理解及假設是錯誤的。我通常會立刻寫下題目給予的input有什麼、格式是什麼、desired output又是什麼。

確認好input&output後,我會思考題目可以用什麼類型的資料結構或是演算法來解。通常在面試的時候,我會和面試官說明我可能會先就一個大概可行的方式來做解答,如果他/她覺得沒有什麼問題的話,我再做後續的優化。在我開始有一些思路後,我會先寫下pseudocode,就是先用英文來說明我的解法會是怎麼樣。每個步驟和面試官確認都沒有問題後,我才會正式寫code。

「他山之石,可以攻錯」,卡題時參考別人解方並再試一次

當然有些時候不論怎麼想都寫不出來,如果是自己練習的時候,我大概在15分鐘後會開始看一些討論,嘗試學習別人的思路。但如果再花10分鐘還是解不出來的話,才會參考別人的解法。我看完別人的答案後,還是會用自己的code再實現一次。如果面試中卡住的話,則是要儘快和面試官討論,我會把我的理解,可能的解法方式和面試官說,同時也說明我的情況可能哪裏不是很確定,讓面試官在適當的時候可以給予我提示。一般來說,公司都是希望有順利的面試經驗,面試官也都願意在溝通正常下給予協助。

紀錄解法的「空間及時間複雜度(Space & Time Complexity)」並反思優化

自己練習寫完之後,我會再寫出解法的空間及時間複雜度(Space & Time Complexity),通常面試也會詢問這個部分,所以自己每個練習也要歸納一下。如果我發現我的解法時間可能不是太好,我會再嘗試看不同人的討論,研究更優化的解法,並再自己寫出不一樣的解法。有些比較棘手的問題我可能會寫2、3個解法比較彼此的優缺點。

筆記本紀錄Q&A

在之前準備面試的時候,我有準備一本筆記本,每次寫完問題之後,我會用筆寫下我在哪一天寫了哪一個問題,並且用很精簡的方式總結問題及解法。隔天要做下一題之前,我會先看一下前一天的問題,嘗試回想我是否可以再次在頭腦中想出大致的解法。如果還是不行的話,再看我自己的總結並做上記號,隔天會再做一次同樣的步驟,直到我可以順利複習出解題的邏輯思路。

如果有和公司面試,不論是電話還是onsite,面試完後我會再檢查我遇到的題目是否和我過去做過的題目類似,如果有的話,是否我的思路在面試中是清晰及正確的,如果沒有的話,我是否有利用對的觀念來解答。面試結束後,會花時間在盤點及複習,從面試中的題目和過往的練習做統整。

解題時切莫僅追求速度,而是追求通盤理解

你可以看到我的練習方式不是很強調快,因為我希望我做完問題可以有很深的理解,所以花很多時間在做整理、複習確認,即使當下沒有那麼理解,隔天回想又想不出的話,我會再複習一次,再隔一天做新題前也會再確認。複習及思考的次數多了,真正把題目所想要考的觀念融會貫通,畢竟面試很難真的遇到原題,重點是我們對於資料結構及演算法的理解,及遇到難題如何面對的應對的思考過程。

條條大路通羅馬,每個人面試準備的方式都不太一樣,以上就是我的資料結構及演算法的準備方式,之前寫找工作的系列文章好像沒有特別提這塊,所以特別再寫出來分享。當然我不是大神每次面試都可以收割5到10個以上offer,所以就請你自己斟酌評估你的學習方法,畢竟我們都要找到對自己最能接受、且有效率的方式來準備面試。

工欲善其事,必先利其器:善用LeetCode學習

我從2015、2016年準備面試的時候,有許多練習演算法的網站,但到了今日,好像Leet Code和練習演算法關係就如同 Google和搜尋一樣,大部分我聽到的準備面試的人都用Leet Code來做練習了!我目前聽到朋友準備面試基本上都會購買 LeetCode的Premium,Premium最大的好處就是可以看到問題和公司的標註,拿過去拒絕我2次的Google為例,LeetCode就有925道題目被大家回報有在Google面試中看到。

當你正要phone or onsite interview的時候,可以聚焦你要面試的公司練習、提高效率的話還是可以提高面試的表現的。Premium還有答題評斷比較快、LeetCode官方解答、及依據公司有Mock interviews等其他功能,但主要大家好像都還是為了company tag的功能而付費,相信以大家拿到offer後的加薪,會覺得這是個很好的投資!

  • 以上內容均為作者個人經驗與觀點分享,不代表其任職公司立場

本文經半路出家軟體工程師在矽谷授權刊登,原文刊載於此

責任編輯:蕭汎如
核稿編輯:翁世航


Tags: